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

时间:2011-04-01 02:16:38

标签: python json

在Python中,有没有办法在尝试解析之前检查字符串是否是有效的JSON?

例如,使用Facebook Graph API之类的东西,有时它会返回JSON,有时它会返回一个图像文件。

5 个答案:

答案 0 :(得分:188)

您可以尝试执行json.loads(),如果您传递的字符串无法解码为JSON,则会ValueError

一般而言,针对此类情况的“Pythonic”理念称为EAFP,因为更容易要求宽恕而不是权限

答案 1 :(得分:111)

示例Python脚本如果字符串有效,则返回布尔值json:

import json

def is_json(myjson):
  try:
    json_object = json.loads(myjson)
  except ValueError, 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

答案 2 :(得分:2)

我想说解析它是你真正完全可以告诉的唯一方法。如果不是正确的格式,python的json.loads()函数(几乎可以肯定)会引发异常。但是,您的示例的目的可能只是检查前几个非空白字符...

我不熟悉facebook发回的JSON,但是来自网络应用的大多数JSON字符串都会以空方[或卷曲{括号开头。没有我知道从这些角色开始的图像格式。

相反,如果您知道可能显示的图像格式,您可以检查字符串的开头是否有签名来识别图像,并假设您有JSON(如果它不是图像)。

在您正在寻找图形的情况下,识别图形而不是文本字符串的另一个简单方法就是测试字符串的前几个字符中的非ASCII字符(假设JSON是ASCII)。

答案 3 :(得分:0)

我想出了一个解决这个问题的通用,有趣的解决方案:

class SafeInvocator(object):
    def __init__(self, module):
        self._module = module

    def _safe(self, func):
        def inner(*args, **kwargs):
            try:
                return func(*args, **kwargs)
            except:
                return None

        return inner

    def __getattr__(self, item):
        obj = getattr(self.module, item)
        return self._safe(obj) if hasattr(obj, '__call__') else obj

你可以像这样使用它:

safe_json = SafeInvocator(json)
text = "{'foo':'bar'}"
item = safe_json.loads(text)
if item:
    # do something

答案 4 :(得分:0)

在 try 块中非常简单。然后您可以验证正文是否是有效的 JSON

async def get_body(request: Request):
try:
    body = await request.json()
except:
    body = await request.body()
return body