显示比"无法解码的JSON对象"更好的错误信息

132 投票
11 回答
324201 浏览
提问于 2025-04-17 16:01

下面是一些Python代码,用来从一个复杂的JSON文件中加载数据:

with open(filename, "r") as f:
  data = json.loads(f.read())

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

with open(filename, "r") as f:
  data = json.load(f)

不过这两种代码表现得差不多)

对于很多类型的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文件中的错误位置呢?

11 个回答

7

你可以试试这个叫做 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 是一种设计上比 JSON 更强大的格式,它可以解析 JSON 文件。它还有一种替代语法,这种语法对人类来说好看,也更容易编辑。我经常用它来处理输入文件。

至于布尔值的大小写问题:看起来 rson 会把错误大小写的布尔值当作字符串来读取。

>>> rson.loads('[true,False]')
[True, u'False']
15

你无法让Python告诉你JSON哪里出错了。你需要去网上找一个工具,比如这个

这个工具会帮你找出你想要解码的JSON中的错误。

179

我发现 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 写成大写的情况,也是如此。

撰写回答