显示比“没有JSON对象可以解码”更好的错误消息

从一些复杂的JSON文件加载数据的Python代码:

with open(filename, "r") as f: data = json.loads(f.read()) 

(注意:最好的代码版本应该是:

 with open(filename, "r") as f: data = json.load(f) 

但都performance出类似的行为)

对于许多types的JSON错误(缺less分隔符,string中不正确的反斜杠等),这将打印一个很好的有用消息,其中包含findJSON错误的行和列号。

但是,对于其他types的JSON错误(包括经典的“在列表中的最后一项使用逗号”,而且还有其他的东西,如大写真/假),Python的输出只是:

 Traceback (most recent call last): File "myfile.py", line 8, in myfunction config = json.loads(f.read()) File "c:\python27\lib\json\__init__.py", line 326, in loads return _default_decoder.decode(s) File "c:\python27\lib\json\decoder.py", line 360, in decode obj, end = self.raw_decode(s, idx=_w(s, 0).end()) File "c:\python27\lib\json\decoder.py", line 378, in raw_decode raise ValueError("No JSON object could be decoded") ValueError: No JSON object could be decoded 

对于这种types的ValueError,你如何让Python告诉你JSON文件中的错误在哪里?

我发现simplejson模块在很多情况下给出了更多的描述性错误,其中内置的json模块是模糊的。 例如,对于列表中最后一项之后的逗号的情况:

 json.loads('[1,2,]') .... ValueError: No JSON object could be decoded 

这不是很具描述性。 simplejson的相同操作:

 simplejson.loads('[1,2,]') ... simplejson.decoder.JSONDecodeError: Expecting object: line 1 column 5 (char 5) 

好多了! 同样也适用于其他常见的错误,如大写True

你将无法得到python告诉你在哪里JSON不正确。 你需要在这里使用一个linter在线

这会向您显示您尝试解码的JSON错误。

您可以尝试在这里find的rson库: http : //code.google.com/p/rson/ 。 我也在PYPI: https ://pypi.python.org/pypi/rson/0.9,所以你可以使用easy_install或pip来获得它。

对于tom给出的例子:

 >>> rson.loads('[1,2,]') ... rson.base.tokenizer.RSONDecodeError: Unexpected trailing comma: line 1, column 6, text ']' 

RSON被devise成JSON的超集,所以它可以parsingJSON文件。 它也有一个替代的语法,对于人类来说更好看和编辑。 我使用它相当多的input文件。

至于大写的布尔值:它看起来rson读取不正确的大写布尔值作为string。

 >>> rson.loads('[true,False]') [True, u'False'] 

我有一个类似的问题,这是由于单引号。 JSON标准( http://json.org )只谈及使用双引号,所以它必须是python json库只支持双引号。

对于这个问题的特定版本,我继续在packaging.py文件中searchload_json_file(path)的函数声明,然后将一个print行偷走到其中:

 def load_json_file(path): data = open(path, 'r').read() print data try: return Bunch(json.loads(data)) except ValueError, e: raise MalformedJsonFileError('%s when reading "%s"' % (str(e), path)) 

这样,在进入try-catch之前,它会打印出json文件的内容,就这样 – 即使我几乎不存在Python的知识,我也能很快弄清楚为什么我的configuration无法读取json文件。
(这是因为我已经build立了我的文本编辑器来编写一个UTF-8 BOM …愚蠢的)

只是提到这个,因为虽然对OP的具体问题可能不是一个好的答案,但这是确定一个非常压迫的bug的根源的一个相当快的方法。 我敢打赌,很多人会偶然发现这篇文章,他们正在为一个MalformedJsonFileError: No JSON object could be decoded when reading …寻找一个更详细的解决schemeMalformedJsonFileError: No JSON object could be decoded when reading … 。 所以这可能会帮助他们。

我有一个类似的问题,这是我的代码:

  json_file=json.dumps(pyJson) file = open("list.json",'w') file.write(json_file) json_file = open("list.json","r") json_decoded = json.load(json_file) print json_decoded 

问题是我忘记了file.close()我做到了,并解决了这个问题。

你可以使用cjson ,声称比纯python实现快250倍,因为你有“一些复杂的JSON文件”,你可能需要运行几次(解码器失败并报告第一个错误只遇到)。