解析包含 Python 中"u as UTF-8 bytes"的 JSON



我有一个来自Facebook的"下载数据"功能的JSON文件,它不是转义Unicode字符作为它们的码位编号,而是作为UTF-8字节序列进行转义。

例如,字母 á (U+00E1( 在 JSON 文件中作为u00c3u00a1而不是u00e1进行转义。 0xC3 0xA1是 U+00E1 的 UTF-8 编码。

Python 3 中的json库将其解码为 Ã?对应于 U+00C3 和 U+00A1。

有没有办法在 Python 中正确解析这样的文件(以便我得到字母 á(?

似乎他们使用 utf-8 将他们的 Unicode 字符串编码为字节,然后将字节转换为 JSON。这是他们非常糟糕的行为。

Python 3 示例:

>>> 'u00c3u00a1'.encode('latin1').decode('utf-8')
'á'

您需要解析 JSON 并遍历整个数据来修复它:

def visit_list(l):
return [visit(item) for item in l]
def visit_dict(d):
return {visit(k): visit(v) for k, v in d.items()}
def visit_str(s):
return s.encode('latin1').decode('utf-8')
def visit(node):
funcs = {
list: visit_list,
dict: visit_dict,
str: visit_str,
}
func = funcs.get(type(node))
if func:
return func(node)
else:
return node
incorrect = '{"foo": ["u00c3u00a1", 123, true]}'
correct_obj = visit(json.loads(incorrect))

最新更新