En Python, existe-t-il un moyen de vérifier si une chaîne est JSON valide avant d'essayer de l'analyser?
Par exemple, en travaillant avec des choses comme l'API Facebook Graph, parfois il renvoie JSON, parfois il peut renvoyer un fichier image.
En Python, existe-t-il un moyen de vérifier si une chaîne est JSON valide avant d'essayer de l'analyser?
Par exemple, en travaillant avec des choses comme l'API Facebook Graph, parfois il renvoie JSON, parfois il peut renvoyer un fichier image.
Réponses:
Vous pouvez essayer de faire json.loads()
, ce qui jettera unValueError
si la chaîne que vous passez ne peut pas être décodée en JSON.
En général, la philosophie « pythonique » pour ce genre de situation est appelée EAFP , pour plus facile de demander pardon que la permission .
loads
dans la clause except?
10
est une valeur numérique JSON valide.
import json
def is_json(myjson):
try:
json_object = json.loads(myjson)
except ValueError as e:
return False
return True
Quelles impressions:
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
Convertissez une chaîne JSON en dictionnaire Python:
import json
mydict = json.loads('{"foo":"bar"}')
print(mydict['foo']) #prints bar
mylist = json.loads("[5,6,7]")
print(mylist)
[5, 6, 7]
Convertissez un objet python en chaîne JSON:
foo = {}
foo['gummy'] = 'bear'
print(json.dumps(foo)) #prints {"gummy": "bear"}
Si vous souhaitez accéder à l'analyse de bas niveau, ne lancez pas la vôtre, utilisez une bibliothèque existante: http://www.json.org/
Excellent tutoriel sur le module JSON python: 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
Impressions:
, 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
est capable de vérifier la syntaxe, d'analyser, de prittifier, d'encoder, de décoder et plus encore:
del json_object
une fois validé?
try
. #StopCanaryAbuse
Je dirais que l'analyse est la seule façon dont vous pouvez vraiment le dire. L'exception sera levée par pythonjson.loads()
fonction (presque certainement) si ce n'est pas le format correct. Cependant, aux fins de votre exemple, vous pouvez probablement simplement vérifier les deux premiers caractères non blancs ...
Je ne connais pas le JSON que Facebook renvoie, mais la plupart des chaînes JSON des applications Web commenceront par un carré ouvert [
ou bouclé{
crochet . Aucun format d'image que je connais ne commence par ces personnages.
Inversement, si vous savez quels formats d'image peuvent apparaître, vous pouvez vérifier le début de la chaîne pour leurs signatures pour identifier les images, et supposer que vous avez JSON si ce n'est pas une image.
Un autre hack simple pour identifier un graphique, plutôt qu'une chaîne de texte, dans le cas où vous recherchez un graphique, consiste simplement à tester les caractères non ASCII dans les deux premières douzaines de caractères de la chaîne (en supposant que le JSON est ASCII ).
J'ai trouvé une solution générique et intéressante à ce problème:
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
et vous pouvez l'utiliser comme ceci:
safe_json = SafeInvocator(json)
text = "{'foo':'bar'}"
item = safe_json.loads(text)
if item:
# do something
except
clause peut cacher toute exception sérieuse. Les exceptions doivent être aussi restrictives que possible.