显示比"无法解码的JSON对象"更好的错误信息
下面是一些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
写成大写的情况,也是如此。