在Python中解析包含“\ u as UTF-8 bytes”的JSON

时间:2018-05-13 11:52:34

标签: python json unicode

我有一个来自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中正确解析这样的文件(以便我得到字母á)?

1 个答案:

答案 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))