我已经在一个名为kommscache.json
的文件中编写了一个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对象?
答案 0 :(得分: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}}}]}
答案 1 :(得分:2)
这不是JSON文件。它似乎是通过简单地编写Python字典的字符串版本而创建的文件。虽然格式相似,但它们并不相同。
您应该显示创建该文件的代码。您需要使用json.dump(data)
而不是简单地调用str()
。