En Python, ¿hay alguna manera de verificar si una cadena es JSON válida antes de intentar analizarla?
Por ejemplo, trabajando con cosas como la API Graph de Facebook, a veces devuelve JSON, a veces puede devolver un archivo de imagen.
En Python, ¿hay alguna manera de verificar si una cadena es JSON válida antes de intentar analizarla?
Por ejemplo, trabajando con cosas como la API Graph de Facebook, a veces devuelve JSON, a veces puede devolver un archivo de imagen.
Respuestas:
Puede intentar hacerlo json.loads()
, lo que arrojará un ValueError
si la cadena que pasa no se puede decodificar como JSON.
En general, la filosofía " pitónica " para este tipo de situación se llama EAFP , por más fácil pedir perdón que permiso .
loads
en la cláusula except?
10
es un valor de número JSON válido.
import json
def is_json(myjson):
try:
json_object = json.loads(myjson)
except ValueError as 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
Convierta una cadena JSON en un diccionario de Python:
import json
mydict = json.loads('{"foo":"bar"}')
print(mydict['foo']) #prints bar
mylist = json.loads("[5,6,7]")
print(mylist)
[5, 6, 7]
Convierta un objeto de Python a una cadena JSON:
foo = {}
foo['gummy'] = 'bear'
print(json.dumps(foo)) #prints {"gummy": "bear"}
Si desea acceder a análisis de bajo nivel, no utilice el suyo propio, use una biblioteca existente: http://www.json.org/
Gran tutorial sobre el módulo Python JSON: https://pymotw.com/2/json/
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, <STDIN> line 1.
json_xs
es capaz de verificar, analizar, prittificar, codificar, decodificar y más sintaxis:
del json_object
alguna vez deberíamos validar?
try
. #StopCanaryAbuse
Yo diría que analizarlo es la única forma en que realmente puedes decirlo por completo. La json.loads()
función de Python generará una excepción (casi con certeza) si no es el formato correcto. Sin embargo, con el propósito de su ejemplo, probablemente pueda verificar los primeros caracteres que no son espacios en blanco ...
No estoy familiarizado con el JSON que Facebook envía, pero la mayoría de las cadenas JSON de aplicaciones web comenzarán con un corchete abierto [
o cuadrado {
. No se conocen formatos de imágenes que comiencen con esos personajes.
Por el contrario, si sabe qué formatos de imagen pueden aparecer, puede verificar el inicio de la cadena para sus firmas para identificar 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 probar los caracteres no ASCII en las primeras dos docenas de caracteres de la cadena (suponiendo que el JSON sea 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
except
cláusula puede ocultar cualquier excepción seria. Las excepciones de captura deben ser lo más restrictivas posible.