¿Cómo compruebo si una cadena es JSON válida en Python?

En Python, ¿hay una manera de verificar si una cadena es JSON válida antes de intentar analizarla?

Por ejemplo, al trabajar con cosas como la API de gráficos de Facebook, a veces devuelve JSON, a veces puede devolver un archivo de imagen.

Puedes intentar hacer json.loads() , que arrojará un ValueError si la cadena que pasas no se puede decodificar como JSON.

En general, la filosofía ” Pythonic ” para este tipo de situación se llama EAFP , para pedir más fácilmente perdón que permiso .

Ejemplo de secuencia de comandos de Python devuelve un valor booleano si una cadena es válida json:

 import json def is_json(myjson): try: json_object = json.loads(myjson) except ValueError, e: return False return True 

Que imprime:

 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 

Convierte una cadena JSON a un diccionario Python:

 import json mydict = json.loads('{"foo":"bar"}') print(mydict['foo']) #prints bar mylist = json.loads("[5,6,7]") print(mylist) [5, 6, 7] 

Convierte un objeto python a cadena JSON:

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

Si desea acceder al análisis de bajo nivel, no haga su propio rollo, use una biblioteca existente: http://www.json.org/

Gran tutorial sobre el módulo JSON de python: https://pymotw.com/2/json/

Es String JSON y muestra errores de syntax y mensajes de error:

 sudo cpan JSON::XS echo '{"foo":[5,6.8],"foo":"bar" bar}' > myjson.json json_xs -t none < myjson.json 

Huellas dactilares:

 , or } expected while parsing object/hash, at character offset 28 (before "bar} at /usr/local/bin/json_xs line 183,  line 1. 

json_xs es capaz de verificar syntax, analizar, clasificar, codificar, decodificar y más:

https://metacpan.org/pod/json_xs

Yo diría que analizarlo es la única forma en la que realmente se puede decir. La excepción será provocada por la función json.loads() python (casi con seguridad) si no tiene el formato correcto. Sin embargo, para los propósitos de su ejemplo, probablemente solo pueda verificar el primer par de caracteres que no sean espacios en blanco …

No estoy familiarizado con el JSON que Facebook envía, pero la mayoría de las cadenas JSON de las aplicaciones web comenzarán con un cuadrado abierto [ o rizado { corchete]. No hay formatos de imágenes que conozco que comiencen con esos personajes.

A la inversa, si sabe qué formatos de imagen pueden aparecer, puede verificar el inicio de la cadena para sus firmas para identificar las imágenes, y asumir que tiene JSON si no es una imagen.

Otro truco simple para identificar un gráfico, en lugar de una cadena de texto, en el caso de que esté buscando un gráfico, es solo probar los caracteres que no son ASCII en el primer par de docenas de caracteres de la cadena (asumiendo que el JSON es ASCII ).

Se me ocurrió una solución genérica e interesante para este problema:

 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 

y puedes usarlo así:

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