【问题标题】:How to decode unicode-encoded JSON object in Python如何在 Python 中解码 unicode 编码的 JSON 对象
【发布时间】:2015-01-22 08:55:14
【问题描述】:

我有一个使用 repr 函数保存到文件中的 JSON 对象:

f = open('file', 'w')
f.write(repr(my_json))
f.close()

编码后的 JSON 现在有前导“u”字符,表示 unicode 编码。

{u'messages': 'messages'}

这是 Python 2.x 的预期行为,但现在我试图弄清楚如何解码存储在该文件中的字符串。我尝试过的一切都给了我同样的错误:

ValueError: Expecting property name: line 1 column 2 (char 1)

帮助?

【问题讨论】:

  • 你为什么不用json.dumps写它们?
  • 不是我写的。我只是试图解码它。
  • @kid_drew 我认为 Rafael 是说你不应该在开头使用 f.write(repr(my_json)) 将其写入文件。您应该改用 json.dump。
  • 即使在f.write 之后阅读也没有任何问题,您使用的是哪个 python 版本?
  • @skyline75489 - 我明白了,而且我已经知道如何使用 json.dumps。我的问题不是关于 json.dumps,而是关于如何撤消现有的错误。数据无法重新生成。

标签: python json


【解决方案1】:

假设写入文件的数据是 json(able),这也意味着它的表示应该是 python 文字。所以...您可以尝试使用ast.literal_eval“解码”它。

例如

import ast
with open('file', 'r') as datafile:
    literal_data = datafile.read()

json_data_decoded = ast.literal_eval(literal_data)

ast.literal_evalu 前缀一起使用的演示:

>>> repr(data)
"{u'foo': u'bar'}"
>>> ast.literal_eval(repr(data))
{u'foo': u'bar'}
>>> ast.literal_eval(repr(data))['foo']
u'bar'

请注意,可能有一些 python 版本 (3.0, 3.1 and 3.2) 这不起作用。对于这些版本,我真的没有很好的解决方法——希望你不需要支持它们。

【讨论】:

  • 顺便说一句,常规 eval 在 2.7 和 3.4 中对我来说效果很好
  • json_data_decoded 对我来说仍然是一个带有前导 'u' 字符的字符串。
  • 从头开始。我搞砸了。有效。 =)
  • @user3467349 -- 是的,eval 应该可以工作,但如果您正在评估的数据恰好是恶意的,也会让您面临痛苦的世界:-)
  • 幸运的是,这只是一关。我们从第三方提取了大量数据,并意外将其错误地存储在文件中。该文件大约有 100MB,因此手动进行更改会很痛苦。
猜你喜欢
  • 2019-12-19
  • 2012-04-10
  • 1970-01-01
  • 2012-09-20
  • 2019-07-26
  • 1970-01-01
  • 1970-01-01
  • 2018-11-30
  • 1970-01-01
相关资源
最近更新 更多