133 votes

Affichage d'un meilleur message d'erreur que "Aucun objet JSON n'a pu être décodé".

Code Python pour charger des données depuis un fichier JSON long et compliqué :

with open(filename, "r") as f:
  data = json.loads(f.read())

(note : la meilleure version du code devrait être :

with open(filename, "r") as f:
  data = json.load(f)

mais les deux présentent un comportement similaire)

Pour de nombreux types d'erreurs JSON (délimiteurs manquants, barres obliques inversées incorrectes dans les chaînes, etc.), cette option imprime un message utile contenant le numéro de ligne et de colonne où l'erreur JSON a été trouvée.

Cependant, pour d'autres types d'erreurs JSON (dont la classique "utilisation d'une virgule sur le dernier élément d'une liste", mais aussi d'autres choses comme la capitalisation de true/false), le résultat de Python est juste :

Traceback (most recent call last):
  File "myfile.py", line 8, in myfunction
    config = json.loads(f.read())
  File "c:\python27\lib\json\__init__.py", line 326, in loads
    return _default_decoder.decode(s)
  File "c:\python27\lib\json\decoder.py", line 360, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "c:\python27\lib\json\decoder.py", line 378, in raw_decode
    raise ValueError("No JSON object could be decoded")
ValueError: No JSON object could be decoded

Pour ce type de ValueError, comment faire pour que Python vous dise où se trouve l'erreur dans le fichier JSON ?

0 votes

Pouvez-vous nous donner un extrait de votre fichier ?

0 votes

Je n'essaie pas de trouver l'erreur dans un fichier particulier maintenant ; j'essaie de modifier mon programme pour qu'il mette en évidence l'erreur dans tout fichier futur qu'il lira.

2 votes

Ce n'est pas directement lié, mais vous pourriez simplement faire json.load(f) au lieu de json.loads(f.read())

180voto

tom Points 5216

J'ai trouvé que le simplejson donne des erreurs plus descriptives dans de nombreux cas où le module intégré json est vague. Par exemple, pour le cas d'avoir une virgule après le dernier élément d'une liste :

json.loads('[1,2,]')
....
ValueError: No JSON object could be decoded

ce qui n'est pas très descriptif. La même opération avec simplejson :

simplejson.loads('[1,2,]')
...
simplejson.decoder.JSONDecodeError: Expecting object: line 1 column 5 (char 5)

Beaucoup mieux ! De même pour d'autres erreurs courantes comme les majuscules True .

20 votes

Les futures versions de Python incluront ces améliorations ; il s'agit du même projet en dessous.

2 votes

0 votes

Un changement simple que j'ai fait pour qu'il soit plus verbeux a été de modifier /usr/lib/python2.7/json/scanner.py donc make_scanner = py_make_scanner au lieu de l'avoir égale à c_make_scanner.

15voto

myusuf3 Points 3924

Vous ne pourrez pas faire en sorte que python vous dise où le JSON est incorrect. Vous aurez besoin d'utiliser un linter en ligne quelque part comme ce

Cela vous montrera les erreurs dans le JSON que vous essayez de décoder.

3 votes

Existe-t-il des outils hors ligne qui peuvent faire cela pour les fichiers JSON confidentiels ?

0 votes

@OJW pas à ma connaissance mais cela devrait résoudre le problème que vous rencontrez ou au moins vous permettre de réparer votre json cassé.

13 votes

Mon fichier JSON est parfait. J'essaie de faire en sorte que mon programme affiche des messages d'erreur utiles et compréhensibles par tous. Leur dire "débarrassez-vous de cette virgule à la ligne 13 colonne 32" est bien. Leur dire "il y a une erreur quelque part dans votre fichier, veuillez le télécharger sur Internet où des gens vous aideront" est mauvais.

7voto

Brad Points 460

Vous pouvez essayer la bibliothèque rson que vous trouverez ici : http://code.google.com/p/rson/ . Je suis également en hausse sur PYPI : https://pypi.python.org/pypi/rson/0.9 vous pouvez donc utiliser easy_install ou pip pour l'obtenir.

pour l'exemple donné par Tom :

>>> rson.loads('[1,2,]')
...
rson.base.tokenizer.RSONDecodeError: Unexpected trailing comma: line 1, column 6, text ']'

RSON est conçu pour être un sur-ensemble de JSON, il peut donc analyser les fichiers JSON. Il dispose également d'une syntaxe alternative, à savoir beaucoup plus agréable à regarder et à modifier pour les humains. Je l'utilise assez souvent pour les fichiers d'entrée.

En ce qui concerne la mise en majuscule des valeurs booléennes : il semble que rson lise les booléens incorrectement mis en majuscule comme des chaînes de caractères.

>>> rson.loads('[true,False]')
[True, u'False']

4voto

Knight Samar Points 51

J'ai eu un problème similaire et il était dû aux guillemets simples. La norme JSON( http://json.org ) ne parle que de l'utilisation de guillemets doubles donc ce doit être que le python json ne supporte que les guillemets doubles.

0voto

billmanH Points 13

De nombreuses sources JSON possèdent un '/n' dans le fichier de données. Cela peut provoquer des erreurs lors de l'analyse syntaxique. Vous pouvez le supprimer en str_object.replace("\n", "") Alors faites votre n = json.loads(str_object.replace("\n", "")) et cela devrait vous donner une liste de travail.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X