【发布时间】:2018-11-10 18:39:50
【问题描述】:
我有一个 JSON 文件,其中的字符串以 raw_unicode_escape 编码(文件本身是 UTF-8)。如何解析它以使字符串在内存中为 UTF-8?
对于个别属性,我可以使用以下代码,但 JSON 非常大,无法在解析后手动转换每个字符串。
# Contents of file 'file.json' ('\u00c3\u00a8' is 'è')
# { "name": "\u00c3\u00a8" }
with open('file.json', 'r') as input:
j = json.load(input)
j['name'] = j['name'].encode('raw_unicode_escape').decode('utf-8')
由于 JSON 可能非常庞大,因此该方法必须是“增量”的,我无法提前读取整个文件,将其保存在字符串中,然后进行一些处理。
最后,我应该注意到 JSON 实际上存储在一个 zip 文件中,所以不是open(),而是ZipFile.open()。
【问题讨论】:
-
您希望您的 Python 字符串是 Python (Unicode) 字符串,简单明了。您无法控制 Python 如何管理其内部内存。
-
这些行是否非常长,是否包含有效的 JSON 片段?换句话说,您是否可以一次处理一行,或许还有一些规定可以将数据返回为您想要的格式?
-
只需在
{ "name": "\u00c3\u00a8" }上使用json.load即可完美解码这些字符。该编码是 JSON 规范的一部分,将由兼容的 JSON 解码器解码。 “原始的 Unicode 转义”是一条红鲱鱼,它们不是你的问题。 -
好的,再说一遍:你的问题不是 JSON。您的问题是 JSON 没有正确编码字符并且您有 JSON 编码的 mojibake,您可以使用您的解决方法来修复。但真正的解决方案应该是 JSON 来自哪里。那可能吗?你控制编码方面吗?或者你至少可以联系那个开发者并要求他们修复他们的编码吗?
-
我同意 deceze。如果你能修复像这样产生垃圾的东西,或者单独预处理文件来修复它,你不需要修复阅读器。
标签: python