显示比“没有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文件”,你可能需要运行几次(解码器失败并报告第一个错误只遇到)。