显示不是“无JSON对象可以被解码”
Python代码从一些长期复杂化JSON文件加载数据更好的错误消息:显示不是“无JSON对象可以被解码”
with open(filename, "r") as f:
data = json.loads(f.read())
(注:最好的代码版本应该是:
with open(filename, "r") as f:
data = json.load(f)
但两者表现出类似的行为)
对于许多类型的JSON错误(丢失分隔符,在字符串不正确反斜线等),这个打印包含行和列n一个很好的有用信息发现JSON错误的地方。
然而,对于其他类型的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
对于这种类型的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的未来版本将包含这些改进;这是下面的同一个项目。 – 2013-02-19 13:04:57
http://*.com/questions/718040/how-to-install-simplejson-package-for-python – OJW 2013-02-25 12:14:01
我做了一个简单的更改,让它更加冗长是编辑'/usr/lib/python2.7/json/scanner.py',所以'make_scanner = py_make_scanner'而不是使它等于c_make_scanner。 – paulie4 2015-10-09 16:13:34
你可以试试在这里找到的rson库:http://code.google.com/p/rson/。我也在PYPI:https://pypi.python.org/pypi/rson/0.9,所以你可以使用easy_install或pip来获得它。
由汤姆给出的例子:
>>> rson.loads('[1,2,]')
...
rson.base.tokenizer.RSONDecodeError: Unexpected trailing comma: line 1, column 6, text ']'
RSON是一个设计为JSON的超集,所以它可以解析JSON文件。它还有一个替代语法,很多更适合人类查看和编辑。我使用它很多输入文件。
至于布尔值的大写:看起来rson读取不正确的大写布尔值作为字符串。
>>> rson.loads('[true,False]')
[True, u'False']
对于我这个问题的特别版本,我继续和packaging.py
文件内搜索的load_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知识 - 我能够快速找出为什么我的配置无法读取json文件。
(这是因为我已经建立了我的文本编辑器编写一个UTF-8 BOM ...愚蠢)
就提这个,因为,虽然可能不是一个好答案OP的具体问题,这是一个相当快速的方法在确定一个非常压抑的错误的来源。我敢打赌,很多人会偶然发现这篇文章,他们正在寻找一个更详细的解决方案的MalformedJsonFileError: No JSON object could be decoded when reading …
。所以这可能会帮助他们。
你应该使用上下文管理器来处理文件I/O('with open(fn)as f'),它会为你处理一个例外的文件。 https://en.wikibooks.org/wiki/Python_Programming/Context_Managers#Basic_resource_management – Rebs 2016-11-29 02:59:49
+1。如果你可以展示一个例子,然后将它标准化到标准行为上,那将是相当整洁的 – 2017-04-10 08:41:10
对不起,在找出问题后,我从未触及任何Python代码。也许别人可以帮忙? – WoodrowShigeru 2017-04-13 15:55:59
我有一个类似的问题,这是我的代码:
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()
我做到了,解决了这一问题。
你可以转储文件的摘录吗? – Ketouem 2013-02-15 16:56:09
我不想在特定文件中找到错误;我正在尝试修改我的程序,以便在未来的任何文件中突出显示错误。 – OJW 2013-02-15 18:42:01
没有直接关系,但是您可以只使用'json.load(f)'而不是'json.loads(f.read())' – 2013-02-25 16:02:09