Vous ne pouvez pas spécifier quelles données sont renvoyées dans l'appel d'API? Je ne suis pas familier avec l'API Facebook, mais cela semble vraiment étrange.
Je peux voir comment cela fonctionnera. M'amène à ma prochaine question. Il lance une ValueError. Ce que je veux faire à ce stade est de renvoyer la chaîne incriminée afin que je puisse faire autre chose avec elle. Jusqu'à présent, je n'ai reçu que le message d'erreur et le type.
Joey Blake
2
Quel est le problème avec le simple retour de la chaîne que vous avez passée loadsdans la clause except?
John Flatness
1
rien de mal à cela, juste une erreur noob de ma part. Il semble que je ne peux pas appeler file.read () deux fois. Mais je peux définir une variable et l'utiliser. Et c'est ce que j'ai fait.
Joey Blake le
5
juste une note ... json.loads ('10 ') ne lance pas ValueError et je suis sûr que' 10 'n'est pas un json valide ...
wahrheit
4
Malgré le fait que la spécification indique qu'un texte JSON doit être un tableau ou un objet, la plupart des encodeurs et décodeurs (y compris ceux de Python) fonctionneront avec n'importe quelle valeur JSON en «haut», y compris les nombres et les chaînes. 10est une valeur numérique JSON valide.
John Flatness
145
Exemple de script Python renvoie un booléen si une chaîne est valide json:
Pensez-vous que nous devrions del json_objectune fois validé?
Akshay
4
Pourquoi diable n'y a-t-il pas de méthode de validation appropriée? Il devrait y avoir un moyen de vérifier les erreurs sans tuer les canaris.
Braden Best
Ce à quoi je veux en venir, c'est que ce n'est pas parce que Python autorise OO que vous pouvez ignorer les autres parties. Je devrais avoir l'option soit A. de laisser la fonction échouer et d'utiliser des exceptions (la manière OO / Python), ou B. d'appeler une fonction qui retourne une valeur (succès ou erreur) au lieu de lancer une exception, puis d'avoir ma fonction , à son tour, retourne une valeur sentinelle qui indique une erreur, de sorte que les erreurs remontent dans la pile d'appels et puissent être utilisées si nécessaire (méthode procédurale / C). Tout comme C ++ ne vous oblige pas à utiliser des exceptions (vous pouvez utiliser errno), Python ne devrait pas non plus le forcer
Braden Best
La validation de la chaîne JSON @BradenBest est hantée par le démon qui rend le problème d'arrêt intéressant. Il n'y a pas de moyen mathématiquement correct de prouver l'exactitude d'une chaîne, sauf pour essayer votre chaîne avec un analyseur et voir si elle se termine sans erreur. Pour voir pourquoi c'est difficile: "Ecrivez-moi un programme qui prouve qu'aucune erreur de syntaxe n'existe dans un programme informatique". Ce n'est pas possible. Les développeurs de langage seront poétiques sur l'éternelle course aux armements de l'encodage et du décodage. Le mieux que nous puissions faire est de retourner oui / non si une chaîne est valide pour un moteur donné, pas pour tous les moteurs possibles.
Eric Leschinski
1
@EricLeschinski mais il n'y a pas de problème d'arrêt ici. Le programme lève clairement une exception si une erreur se produit lors de l'analyse de JSON. Par conséquent, le programme sait quand l'entrée JSON est invalide. Par conséquent, il est possible à 100% d'avoir une fonction qui vérifie si l'entrée est valide sans avoir à l'utiliser try. #StopCanaryAbuse
Braden Best
2
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 ).
Je pense que les solutions générales sont bonnes, mais dans ce cas, la exceptclause peut cacher toute exception sérieuse. Les exceptions doivent être aussi restrictives que possible.
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 .
la source
loads
dans la clause except?10
est une valeur numérique JSON valide.Exemple de script Python renvoie un booléen si une chaîne est valide json:
Quelles impressions:
Convertissez une chaîne JSON en dictionnaire Python:
Convertissez un objet python en chaîne JSON:
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/
Est String JSON et affiche les erreurs de syntaxe et les messages d'erreur:
Impressions:
json_xs
est capable de vérifier la syntaxe, d'analyser, de prittifier, d'encoder, de décoder et plus encore:https://metacpan.org/pod/json_xs
la source
del json_object
une fois validé?try
. #StopCanaryAbuseJe dirais que l'analyse est la seule façon dont vous pouvez vraiment le dire. L'exception sera levée par python
json.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 ).
la source
J'ai trouvé une solution générique et intéressante à ce problème:
et vous pouvez l'utiliser comme ceci:
la source
except
clause peut cacher toute exception sérieuse. Les exceptions doivent être aussi restrictives que possible.