【问题标题】:Load a JSON with raw_unicode_escape encoded strings加载带有 raw_unicode_escape 编码字符串的 JSON
【发布时间】: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


【解决方案1】:

由于codecs.open('file.json', 'r', 'raw_unicode_escape') 以某种方式起作用,我查看了它的source code 并想出了一个解决方案。

>>> from codecs import getreader
>>>
>>> with open('file.json', 'r') as input:
...     reader = getreader('raw_unicode_escape')(input)
...     j = json.loads(reader.read().encode('raw_unicode_escape'))
...     print(j['name'])
...
è

当然,即使输入是另一种类型的类似文件的对象,例如在我的情况下是 zip 存档中的文件,这也将起作用。

最终,我拒绝了增量编码器的假设(它对 JSON 没有意义,see),但对于那些感兴趣的人,我建议看看 this answercodecs.iterencode() .

【讨论】:

    猜你喜欢
    • 2011-03-03
    • 2013-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-12
    • 2021-08-14
    • 2013-06-15
    相关资源
    最近更新 更多