如何在Python中检查字符串是否有效的JSON?

295 投票
7 回答
347878 浏览
提问于 2025-04-16 14:51

在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 可以进行语法检查、解析、美化、编码、解码等操作:

https://metacpan.org/pod/json_xs

326

你可以试试用 json.loads() 这个方法,如果你传入的字符串不能被解码成JSON格式,它会抛出一个 ValueError 错误。

一般来说,对于这种情况,"Pythonic" 的哲学叫做 EAFP,意思是 请求原谅比请求许可更简单

撰写回答