python - 在 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 中正确解析这样的文件(以便我得到字母 á)?
解决方案
似乎他们使用 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))
推荐阅读
- sql - 如果列为 NULL,则合并 SQL 查询
- bash - 转义正则表达式活动字符
- swift - 计算来自不同类的每个 IndexPath 的数据距离
- javascript - 如何将 TaskT 与 Trampoline 的 monad 实例结合起来进行无堆栈异步计算?
- python - Python tkinter 应用程序需要一个目前不存在的变量
- javascript - 如何在chrome的弹出窗口中单击特定按钮
- arrays - 有没有办法在 C 中的不同索引处存储具有重复值的数组?
- r - 用因子变量在 data.table 中插入数值变量
- html - 当悬停在另一个元素上时,我可以更改元素的背景颜色吗?
- python-3.x - 这可以针对python中的多个xsd验证xml吗?