Code Python pour charger des données à partir d'un long fichier JSON compliqué:
with open(filename, "r") as f:
data = json.loads(f.read())
(note: la meilleure version de 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'erreur JSON (délimiteurs manquants, barres obliques inverses incorrectes dans les chaînes, etc.), cela imprime un joli 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'erreur JSON (y compris le classique "utiliser la virgule sur le dernier élément d'une liste", mais aussi d'autres choses comme mettre en majuscule vrai / faux), la sortie de Python est simplement:
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 en sorte que Python vous dise où se trouve l'erreur dans le fichier JSON?
json.load(f)
place dejson.loads(f.read())
Réponses:
J'ai trouvé que le
simplejson
module donne des erreurs plus descriptives dans de nombreux cas où lejson
module intégré est vague. Par exemple, dans le cas d'une virgule après le dernier élément d'une liste:ce qui n'est pas très descriptif. La même opération avec
simplejson
:Bien mieux! De même pour d'autres erreurs courantes telles que la mise en majuscule
True
.la source
json
bibliothèque stdlib a été mise à jour et donne le nouveau format de message d'erreur. Cependant, je n'ai pas le temps de suivre les versions exactes pour le moment.Vous ne pourrez pas obtenir de python pour vous dire où le JSON est incorrect. Vous devrez utiliser un linter en ligne quelque part comme celui-ci
Cela vous montrera une erreur dans le JSON que vous essayez de décoder.
la source
Vous pouvez essayer la bibliothèque rson disponible ici: http://code.google.com/p/rson/ . Je l'ai également sur PYPI: https://pypi.python.org/pypi/rson/0.9 afin que vous puissiez utiliser easy_install ou pip pour l'obtenir.
pour l'exemple donné par tom:
RSON est conçu pour être un sur-ensemble de JSON, il peut donc analyser les fichiers JSON. Il a également une syntaxe alternative qui est beaucoup plus agréable à regarder et à modifier pour les humains. Je l'utilise pas mal pour les fichiers d'entrée.
Quant à la mise en majuscule des valeurs booléennes: il apparaît que rson lit les booléens en majuscules incorrectes comme des chaînes.
la source
J'ai eu un problème similaire et c'était dû à des citations uniques. Le standard JSON ( http://json.org ) ne parle que de l'utilisation de guillemets doubles , il faut donc que la
json
bibliothèque python ne supporte que les guillemets doubles.la source
Pour ma version particulière de ce problème, je suis allé de l'avant et j'ai recherché la déclaration de fonction
load_json_file(path)
dans lepackaging.py
fichier, puis j'ai introduit uneprint
ligne en contrebande :De cette façon, il imprimait le contenu du fichier json avant d'entrer dans le try-catch, et de cette façon - même avec mes connaissances Python à peine existantes - j'ai pu comprendre rapidement pourquoi ma configuration ne pouvait pas lire le fichier json.
(C'était parce que j'avais configuré mon éditeur de texte pour écrire une nomenclature UTF-8… stupide)
Mentionner simplement cela parce que, bien que ce ne soit peut-être pas une bonne réponse au problème spécifique du PO, c'était une méthode assez rapide pour déterminer la source d'un bogue très oppressant. Et je parie que beaucoup de gens tomberont sur cet article qui recherchent une solution plus verbeuse pour un
MalformedJsonFileError: No JSON object could be decoded when reading …
. Cela pourrait donc les aider.la source
with open(fn) as f
), il gère la fermeture du fichier dans une exception pour vous. en.wikibooks.org/wiki/Python_Programming/...Quant à moi, mon fichier json est très gros, lorsqu'il est utilisé
json
en python, il obtient l'erreur ci-dessus.Après l'installation
simplejson
parsudo pip install simplejson
.Et puis je l'ai résolu.
la source
J'ai eu un problème similaire, c'était mon code:
le problème était que j'avais oublié de le faire
file.close()
et de résoudre le problème.la source
with open(fn) as f
), il gère la fermeture du fichier dans une exception pour vous. en.wikibooks.org/wiki/Python_Programming/...La réponse acceptée est la plus simple pour résoudre le problème. Mais dans le cas où vous n'êtes pas autorisé à installer le simplejson en raison de la politique de votre entreprise, je propose ci-dessous une solution pour résoudre le problème particulier de "l'utilisation de la virgule sur le dernier élément d'une liste" :
Créez une classe enfant "JSONLintCheck" pour hériter de la classe "JSONDecoder" et remplacez la méthode init de la classe "JSONDecoder" comme ci-dessous:
la source
Frappez simplement le même problème et dans mon cas, le problème était lié à
BOM
(marque d'ordre d'octet) au début du fichier.json.tool
refuserait de traiter même un fichier vide (juste des accolades) jusqu'à ce que je supprime la marque UTF BOM.Ce que j'ai fait est:
set nobomb
)Cela a résolu le problème avec json.tool. J'espère que cela t'aides!
la source
Lorsque votre fichier est créé. Au lieu de créer un fichier avec du contenu est vide. Remplacer par:
la source
Vous pouvez utiliser cjson , qui prétend être jusqu'à 250 fois plus rapide que les implémentations pur-python, étant donné que vous avez "un long fichier JSON compliqué" et que vous devrez probablement l'exécuter plusieurs fois (les décodeurs échouent et signalent la première erreur qu'ils rencontre uniquement).
la source