首页 > 解决方案 > 在 Python 中解析包含“\u 作为 UTF-8 字节”的 JSON

问题描述

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

标签: pythonjsonunicode

解决方案


似乎他们使用 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))

推荐阅读