我有一个来自Facebook的“下载您的数据”功能的JSON文件,而不是将Unicode字符作为其代码点编号转义,它只是作为一个UTF-8字节序列进行转义。
例如,字母á(U + 00E1)在JSON文件中以\u00c3\u00a1
而不是\u00e1
进行转义。 0xC3 0xA1是U + 00E1的UTF-8编码。
Python 3中的json
库将其解码为¡,对应于U + 00C3和U + 00A1。
有没有办法在Python中正确解析这样的文件(以便我得到字母á)?
答案 0 :(得分:1)
似乎他们使用utf-8将他们的Unicode字符串编码为字节,然后将字节转换为JSON。这是非常糟糕的行为。
Python 3示例:
>>> '\u00c3\u00a1'.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": ["\u00c3\u00a1", 123, true]}'
correct_obj = visit(json.loads(incorrect))