当前位置: 首页 > 知识库问答 >
问题:

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

崔琦
2023-03-14

我有一个来自Facebook的“下载您的数据”功能的JSON文件,它不是将Unicode字符作为其代码点号转义,而是作为UTF-8字节序列转义。

例如,字母á (U 00E1)在JSON文件中转义为< code>\u00c3\u00a1,而不是< code>\u00e1。0xC3 0xA1是U 00E1的UTF-8编码。

Python 3中的< code>json库将其解码为,对应于U 00C3和U 00A1。

在Python中有没有一种方法可以正确解析这样的文件(这样我就可以得到字母á)?

共有1个答案

乐正嘉瑞
2023-03-14

他们似乎使用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))
 类似资料:
  • 问题内容: 我需要唯一地标识和存储一些URL。问题在于有时它们会包含“ ..”,就像基本上,如果我没记错的话。 是否有Python函数或复杂的方法来解析此URL? 问题答案: 有一个简单的解决方案使用: 但是,如果没有结尾斜杠(最后一个组件是文件,而不是目录),则最后一个组件将被删除。 此修复程序使用urlparse函数提取路径,然后使用(的posixpath版本)对组件进行规范化。用斜杠补偿一个

  • 问题内容: 我正在尝试使用具有库重复键的无效结构解析json 。如果json中有重复的键,我想将它们提取为。 我要解析的示例(我要解析的实际json来自json导出): 但是,由于此json具有重复键,因此仅保留了最后一个值: 我也试过了具有支持的模块,但是它不能像预期的那样用于嵌套json对象。 将Guava模块用于之前显示的json的示例: 我应该如何使用库解决此问题?是否还有其他支持Java

  • 问题内容: 在我的网站中,我尝试将字符串转换为包含换行符的JSON。 这将产生“意外令牌”错误。我需要以某种方式逃脱吗? 问题答案: 是的,您应该同时退出这两个字符,因为它们都属于控制字符列表。您可以在此处找到需要转义的字符的完整列表。您的代码将是 JSFiddle:链接

  • 问题内容: 有一个node.js应用程序正在接收包含文字NaN的JSON数据字符串,例如 这在Node.js中崩溃。如果可以,我想解析它。 我知道这不是JSON规范的一部分。大多数SO链接(在json中发送NaN812/sending- nan-in-json))建议修复输出。 在这里,尽管数据是在我无法控制的服务器中生成的,但是它是由一个商业Java库提供的,我可以在其中查看源代码。它是由Goo

  • 问题内容: 如何在SQL Server中解析包含URL路径值的列? 输入 应该返回: 每行的路径值不同 问题答案: 如果您拥有已知的或最大数量的级别,则可以使用一些XML。 如果未知,则必须动态进行。 例子 退货

  • 我从accuweather获得了以下带有json的代码 我尝试通过Jackson将此对象解析为POJO 我有json中指定的所有模型,如、数组、,由组成(在json中命名为最小值和最大值)等,它们都有私有字段和公共构造函数、getter和setter。但是我没有一些字段,因为我想省略它们(Day、night、EpochDate、Source)。 当我运行程序时,我得到了错误 com.fasterx