从某个长而复杂的JSON文件加载数据的Python代码:
with open(filename, "r") as f:
data = json.loads(f.read())
(注意:最好的代码版本应该是:
with open(filename, "r") as f:
data = json.load(f)
但两者都表现出相似的行为)
对于许多类型的JSON错误(缺少分隔符、字符串中不正确的反斜杠等),这将打印一条很有帮助的消息,其中包含发现JSON错误的行号和列号。
然而,对于其他类型的JSON错误(包括经典的“在列表中的最后一项上使用逗号”,以及大写true/false之类的其他事情),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文件中的位置?
发布于 2013-02-19 19:33:46
我发现,在内置json
模块不明确的许多情况下,simplejson
模块会提供更多描述性错误。例如,对于列表中最后一项后有逗号的情况:
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
,也是如此。
发布于 2013-02-16 00:58:05
您将无法让python告诉您JSON在哪里不正确。你需要在像this这样的地方使用linter
这将显示您正在尝试解码的JSON中的错误。
发布于 2014-12-22 09:29:52
对于这个问题的特定版本,我继续搜索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-8BOM…愚蠢)
之所以提到这一点,是因为虽然这可能不是OP特定问题的一个很好的答案,但这是确定一个非常令人压抑的bug的来源的一个相当快速的方法。我敢打赌,许多正在寻找更冗长的MalformedJsonFileError: No JSON object could be decoded when reading …
解决方案的人都会偶然读到这篇文章。所以这可能会对他们有所帮助。
https://stackoverflow.com/questions/14899506
复制相似问题