用于从一些冗长复杂的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
.
您可以尝试在此处找到的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)
归档时间: |
|
查看次数: |
253211 次 |
最近记录: |