1

我已经将一个 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 语法不正确。我已经仔细检查过,这个片段中的所有大括号和方括号都有匹配的右括号。

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

4

2 回答 2

3

您保存了 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}}}]}
于 2013-03-05T13:22:59.660 回答
2

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

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

于 2013-03-05T13:23:06.093 回答