如何在Python中检查字符串是否有效的JSON?
在Python中,有没有办法在尝试解析一个字符串之前,先检查它是否是有效的JSON格式?
比如说,当我们使用像Facebook Graph API这样的东西时,有时候它会返回JSON格式的数据,有时候它可能会返回一个图片文件。
7 个回答
2
我觉得解析是唯一能完全判断的方法。如果格式不正确,Python 的 json.loads()
函数几乎肯定会抛出异常。不过,针对你的例子,你可以先检查前面几个非空白字符。
我对 Facebook 返回的 JSON 不太熟悉,但大多数网页应用返回的 JSON 字符串通常是以一个开方括号 [
或开花括号 {
开头的。我知道的图像格式没有以这些字符开头。
反过来说,如果你知道可能出现的图像格式,可以检查字符串开头的特征来识别图像,如果不是图像,那就可以认为是 JSON。
还有一个简单的方法可以用来判断是图形还是文本字符串,如果你在找图形的话,可以检查字符串前面几十个字符中是否有非 ASCII 字符(假设 JSON 是 ASCII 格式)。
227
示例 Python 脚本返回一个布尔值,判断字符串是否是有效的 JSON:
import json
def is_json(myjson):
try:
json.loads(myjson)
except ValueError as e:
return False
return True
输出结果为:
print is_json("{}") #prints True
print is_json("{asdf}") #prints False
print is_json('{ "age":100}') #prints True
print is_json("{'age':100 }") #prints False
print is_json("{\"age\":100 }") #prints True
print is_json('{"age":100 }') #prints True
print is_json('{"foo":[5,6.8],"foo":"bar"}') #prints True
将 JSON 字符串转换为 Python 字典:
import json
mydict = json.loads('{"foo":"bar"}')
print(mydict['foo']) #prints bar
mylist = json.loads("[5,6,7]")
print(mylist)
[5, 6, 7]
将 Python 对象转换为 JSON 字符串:
foo = {}
foo['gummy'] = 'bear'
print(json.dumps(foo)) #prints {"gummy": "bear"}
如果你想进行底层解析,别自己动手,使用现有的库: http://www.json.org/
关于 Python JSON 模块的精彩教程: https://pymotw.com/2/json/
判断字符串是否是 JSON,并显示语法错误和错误信息:
sudo cpan JSON::XS
echo '{"foo":[5,6.8],"foo":"bar" bar}' > myjson.json
json_xs -t none < myjson.json
输出结果为:
, or } expected while parsing object/hash, at character offset 28 (before "bar}
at /usr/local/bin/json_xs line 183, <STDIN> line 1.
json_xs
可以进行语法检查、解析、美化、编码、解码等操作:
326
你可以试试用 json.loads()
这个方法,如果你传入的字符串不能被解码成JSON格式,它会抛出一个 ValueError
错误。
一般来说,对于这种情况,"Pythonic" 的哲学叫做 EAFP,意思是 请求原谅比请求许可更简单。