【问题标题】:What is wrong with my JSON object? [duplicate]我的 JSON 对象有什么问题? [复制]
【发布时间】:2013-02-19 22:00:35
【问题描述】:

我已经将一个 JSON 对象(由其他人生成,使用我无法访问的代码)写入一个名为 kommscache.json 的文件,现在我正尝试在 Python 中再次读取它。

这就是我的工作:

import json
from pprint import pprint

with open('kommscache.json') as data_file:
    data = json.load(data_file)

pprint(data)

在调用json.load() 时,我收到以下错误消息:

Traceback (most recent call last):
  File "./kladd.py", line 7, in <module>
    data = json.load(data_file)
  File "/usr/lib/python2.7/json/__init__.py", line 280, in load
    **kw)
  File "/usr/lib/python2.7/json/__init__.py", line 328, in loads
    return _default_decoder.decode(s)
  File "/usr/lib/python2.7/json/decoder.py", line 365, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/lib/python2.7/json/decoder.py", line 381, in raw_decode
    obj, end = self.scan_once(s, idx)
ValueError: Expecting property name: line 1 column 1 (char 1)

JSON 文件的前几行如下所示(我也尝试了非漂亮打印的版本,结果相同):

{u'filtered': 458,
 u'items': [{u'comment_count': 0,
             u'current_revision': {u'created_by': {u'avatar': 19435601,

不幸的是,我无法向您展示整个文件,因为它包含一些敏感数据(而且它的长度超过 6000 行......),但如果我正确阅读错误消息,则错误已经在开头文件。但是,我不明白为什么这个 JSON 语法不正确。我已经仔细检查过,这个 sn-p 中的所有大括号和方括号都有匹配的右括号。

为什么我不能加载这个 JSON 对象?

【问题讨论】:

  • 不太了解 JSON,但我觉得你很可疑。
  • @JensSchauder:这些是 Python unicode 字符串文字。 u'' 创建一个 unicode 字符串,而 '' 创建一个字节字符串。这是 Python,不是 JSON。

标签: python json syntax


【解决方案1】:

您保存了 Python 对象的文字表示,不是 JSON。

您可以使用 ast.literal_eval() 对它们进行解码,但您可能希望改用 JSON 编写代码。确保在保存时在结构上使用 json.dumps()

使用ast.literal_eval()(关闭所有大括号后):

>>> import ast
>>> ast.literal_eval('''\
... {u'filtered': 458,
...  u'items': [{u'comment_count': 0,
...              u'current_revision': {u'created_by': {u'avatar': 19435601,
... }}}]}''')
{u'filtered': 458, u'items': [{u'comment_count': 0, u'current_revision': {u'created_by': {u'avatar': 19435601}}}]}

【讨论】:

  • 别让他有这种想法……
  • @MarkusUnterwaditzer:为什么不呢? ast.literal_eval() 非常安全。它的性能不如 JSON 反序列化,但没有安全风险。像 JSON 一样,只支持原始的 python 类型。它甚至会支持数字键(JSON 不支持)。
  • 这不是我的意思。我只是认为将它用于数据序列化是一个坏主意。
  • @MarkusUnterwaditzer:为什么你认为这是个坏主意?我碰巧同意,但动机会很有趣。主要问题当然是数据没有序列化为 JSON,但是如果 OP 没有其他方法来修复保存过程或需要恢复该数据,那么ast.literal_eval 是再次加载数据的好方法。跨度>
  • 实际上,我可能有点误导 - 我确实可以控制打印到文件,只是不能控制生成对象。由于我认为该对象已经是 JSON 格式,因此我认为将其打印到标准输出并通过管道传输到文件就足够了。相反,我现在按照您的建议使用json.dumps(),一切正常。谢谢!
【解决方案2】:

这不是 JSON 文件。它似乎是通过简单地编写 Python 字典的字符串版本创建的文件。尽管格式相似,但它们并不相同。

您应该显示创建文件的代码。您需要使用json.dump(data) 而不是简单地调用str()

【讨论】:

  • 谢谢!我只是在做pprint(myobj) 并将输出通过管道传输到一个文件,但更改为print json.dumps(myobj) 解决了这个问题。
猜你喜欢
  • 2014-06-26
  • 1970-01-01
  • 2018-11-01
  • 2013-02-01
  • 1970-01-01
  • 2011-04-27
相关资源
最近更新 更多