2013-03-05 99 views
1

我写了一个名为kommscache.json的JSON对象(由其他人生成,代码中我无法访问),现在我试图在Python中再次读取它。我的JSON对象有什么问题?

这是我做的:

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文件看起来像这样的几行(我已经试过非prettyprinted版本太多,结果相同):

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

Unfortunatel Ÿ我无法向您显示整个文件,因为它包含一些敏感数据(并且它的长度超过6000行...),但是如果我正确读取错误消息,则错误已在文件的开头。但是,我看不出为什么这个JSON语法不正确。我已经仔细检查过,并且此代码段中的所有大括号和括号都与关闭的大括号相匹配。

为什么我无法加载这个JSON对象?

+1

不知道JSON,但你看起来很腥。 – 2013-03-05 13:23:58

+1

@JensSchauder:那些是Python unicode字符串文字。 'u'''创建一个unicode字符串,而'''创建一个字节字符串。这是Python,而不是JSON。 – 2013-03-05 13:25:54

回答

2

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

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

+0

谢谢!我只是在执行'pprint(myobj)'并将输出管道输出到一个文件,但是改成'print json.dumps(myobj)'解决了这个问题。 – 2013-03-05 13:55:31

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}}}]} 
+0

不要让他得到这样的想法... – 2013-03-05 13:35:20

+0

@MarkusUnterwaditzer:为什么不呢? 'ast.literal_eval()'是完全安全的。它的表现不如JSON反序列化,但没有安全风险。像JSON一样,只支持原始python类型。它甚至会支持数字键(JSON不支持)。 – 2013-03-05 13:36:32

+0

这不是我的观点。我只是认为将它用于数据序列化是一个糟糕的主意。 – 2013-03-05 13:39:19