【问题标题】:Parse JSON containing "\u as UTF-8 bytes" in Python在 Python 中解析包含“\u 作为 UTF-8 字节”的 JSON
【发布时间】:2018-05-13 11:52:33
【问题描述】:

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

【问题讨论】:

    标签: python json unicode


    【解决方案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))
    

    【讨论】:

    • 如果字符串是从文件中加载的,这不起作用,这种情况下的字符串是'\\u00c3\\u00a1'
    • “它不起作用”是什么意思?字符串是否包含文字反斜杠?如果是这样,您可以在它们上使用json.loads 来解析此符号,或者使用ast.literal_eval
    • 我在问题中提到的\u00c3\u00a1 是它是如何保存在 JSON 文件本身中的,这意味着当我在文本编辑器中查看该文件时,我确实看到了(不涉及 Python在那时候)。所以是的,文件和从中加载的字符串都包含文字反斜杠。但是当我使用 json.loads 时,它被错误地解析为 á
    • 您需要在解析后修复整个数据。我刚刚编辑了我的答案以添加代码以显示如何修复它。
    猜你喜欢
    • 2016-05-11
    • 1970-01-01
    • 2012-11-29
    • 2018-11-17
    • 2020-05-29
    • 2015-07-22
    • 1970-01-01
    • 2018-08-30
    • 2016-04-01
    相关资源
    最近更新 更多