如何检查一个string在Python中是否是有效的JSON?

在Python中,有没有办法在试图parsing它之前检查一个string是否是有效的JSON?

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

您可以尝试执行json.loads() ,如果您传递的string不能被解码为JSON,则会引发ValueError

一般来说,这种情况下的“ Pythonic ”哲学被称为EAFP , 比容许更容易要求宽恕

Python脚本示例返回一个布尔值,如果一个string是有效的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 

将JSONstring转换为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对象转换为JSONstring:

 foo = {} foo['gummy'] = 'bear' print(json.dumps(foo)) #prints {"gummy": "bear"} 

如果您想访问低级parsing,请不要自行编译,使用现有的库: http : //www.json.org/

关于python JSON模块的很好的教程: https : //pymotw.com/2/json/

我会说parsing它是唯一的方式,你真的可以完全说。 如果不是正确的格式,python的json.loads()函数(几乎可以肯定)会引发exception。 然而,你的例子的目的,你可能只是检查第一对非空白字符…

我不熟悉Facebook发回的JSON,但是来自Web应用程序的大部分JSONstring将以开放的正方形([)或curl({)括号开头。 没有图像格式我知道这些字符开始。

相反,如果您知道可能会显示哪些图像格式,则可以检查string的起始位置以识别图像,并假设您使用JSON(如果不是图像)。

另一个简单的方法是在查找graphics的情况下识别graphics而不是文本string,只是在string的前几十个字符中testing非ASCII字符(假设JSON是ASCII )。

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

 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 

我也在我的博客上发布