显示比"无JSON对象可以解码"更好的错误消息

OJW*_*OJW 124 python json

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

with open(filename, "r") as f:
  data = json.loads(f.read())
Run Code Online (Sandbox Code Playgroud)

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

with open(filename, "r") as f:
  data = json.load(f)
Run Code Online (Sandbox Code Playgroud)

但都表现出类似的行为)

对于许多类型的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
Run Code Online (Sandbox Code Playgroud)

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

tom*_*tom 168

我发现simplejson在内置json模块含糊不清的许多情况下,模块会提供更多描述性错误.例如,对于在列表中的最后一项之后使用逗号的情况:

json.loads('[1,2,]')
....
ValueError: No JSON object could be decoded
Run Code Online (Sandbox Code Playgroud)

这不是很具描述性.同样的操作simplejson:

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

好多了!同样对于其他常见错误,如大写True.

  • 未来的Python版本将包括这些改进; 它是下面的同一个项目. (17认同)
  • http://stackoverflow.com/questions/718040/how-to-install-simplejson-package-for-python (2认同)
  • @jxramos:OP 使用 Python 2.7,从回溯中可以明显看出。快速[在 ideone.com (Python 3.7.3) 上进行测试](https://ideone.com/sg5F2K) 显示 stdlib `json` 库已更新并提供了新的错误消息格式。不过,我现在没有时间跟踪确切的版本。 (2认同)

myu*_*uf3 14

你不能让python告诉你JSON不正确的地方.你需要在这样的地方使用linter在线

这将显示您尝试解码的JSON中的错误.

  • 我的JSON文件很好 - 我正在尝试让我的程序打印有用的错误消息,任何人都可以理解.告诉他们"在第13栏第32栏摆脱那个逗号"是好的.告诉他们"你的文件中某处有错误,请将其上传到人们会帮助你的互联网",这很糟糕. (12认同)
  • 是否有可以为机密JSON文件执行此操作的脱机工具? (2认同)

Bra*_*ell 7

您可以尝试在此处找到的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 ']'
Run Code Online (Sandbox Code Playgroud)

RSON被设计为JSON的超集,因此它可以解析JSON文件.它也有一种语法是很多更好的人来看待和编辑.我对输入文件使用了很多.

至于布尔值的大写:似乎rson读错了大写的布尔值作为字符串.

>>> rson.loads('[true,False]')
[True, u'False']
Run Code Online (Sandbox Code Playgroud)