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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (22)

从一些复杂的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文件中的错误在哪里?

提问于
用户回答回答于

我发现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不正确的地方。你需要的地方使用网上棉绒像这样

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

扫码关注云+社区