J'ai essayé de trouver un bon moyen de charger des objets JSON en Python. J'envoie ces données json:
{'http://example.org/about': {'http://purl.org/dc/terms/title': [{'type': 'literal', 'value': "Anna's Homepage"}]}}
au backend où il sera reçu sous forme de chaîne, alors je l'ai utilisé json.loads(data)
pour l'analyser.
Mais à chaque fois, j'ai eu la même exception:
ValueError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
Je l'ai googlé mais rien ne semble fonctionner à part cette solution json.loads(json.dumps(data))
qui ne me semble pas très efficace car elle accepte tout type de données même celles qui ne sont pas au format json.
Toutes les suggestions seront très appréciées.
json.dumps()
plutôt que de simplement écrire python et espérez que la notation python fonctionnera dans votre lecteur JavaScript.print(jsonpickle_deserialized_object_string)
et j'ai essayé de l'utiliser. Pour une raison quelconque,print()
change les citations de"
à'
Réponses:
Ce:
n'est pas JSON.
Ce:
est JSON.
EDIT:
Certains commentateurs ont suggéré que ce qui précède ne suffit pas.
Spécification JSON - RFC7159 indique qu'une chaîne commence et se termine par des guillemets. C'est ça
"
.Une quoute simple
'
n'a pas de signification sémantique en JSON et n'est autorisée qu'à l'intérieur d'une chaîne.la source
comme JSON autorise uniquement les chaînes entre guillemets, vous pouvez manipuler la chaîne comme ceci:
si votre JSON contient des guillemets simples échappés (
\'
), vous devez utiliser le code suivant plus précis:Cela remplacera toutes les occurrences de guillemets simples avec guillemets doubles dans la chaîne JSON
str
et dans ce dernier cas ne remplacera pas les guillemets simples échappés.Vous pouvez également utiliser
js-beautify
ce qui est moins strict:la source
Dans mon cas, les doubles guillemets n'étaient pas un problème.
La dernière virgule m'a donné le même message d'erreur.
Pour supprimer cette virgule, j'ai écrit un code simple.
Et cela a fonctionné pour moi.
la source
echo '{"json":"obj",}' | python -m json.tool
lorsqu'il est exécuté dans le shell, donne "Nom de la propriété attendue entre guillemets: ligne 1 colonne 15 (char 14)". Les virgules de fin ne sont pas du JSON légal, mais ce serait bien si le module Python JSON émettait un message d'erreur pertinent dans ce cas.Tout simplement, cette chaîne n'est pas un JSON valide. Comme le dit l'erreur, les documents JSON doivent utiliser des guillemets doubles.
Vous devez corriger la source des données.
la source
J'ai vérifié vos données JSON
sur http://jsonlint.com/ et les résultats étaient:
en le modifiant avec la chaîne suivante, résolvez l'erreur JSON:
la source
Les chaînes JSON doivent utiliser des guillemets doubles. La bibliothèque JSON python applique cela afin que vous ne puissiez pas charger votre chaîne. Vos données doivent ressembler à ceci:
Si ce n'est pas quelque chose que vous pouvez faire, vous pouvez utiliser à la
ast.literal_eval()
place dejson.loads()
la source
json.loads()
ast.literal_eval
entraîneValueError: malformed string
si la chaîne JSON a une valeur booléenne.cela résoudra le problème.
la source
Comme il est clairement indiqué par erreur, les noms doivent être placés entre guillemets doubles au lieu de guillemets simples. La chaîne que vous transmettez n'est tout simplement pas un JSON valide. Cela devrait ressembler à
la source
J'ai utilisé cette méthode et j'ai réussi à obtenir le résultat souhaité. mon script
production
la source
Cela a parfaitement bien fonctionné pour moi. Merci.
la source
Bien que ce soit la bonne solution, mais cela peut conduire à un mal de tête s'il existe un JSON comme celui-ci -
Vous avez remarqué que la valeur "True" ? Utilisez ceci pour que les choses soient vérifiées deux fois pour les booléens. Cela couvrira ces cas -
Assurez-vous également de ne pas
Ce doit être une autre variable.
la source
J'ai eu un problème similaire. Deux composants communiquant entre eux utilisaient une file d'attente.
Le premier composant ne faisait pas json.dumps avant de mettre le message dans la file d'attente. Ainsi, la chaîne JSON générée par le composant récepteur était entre guillemets simples. Cela provoquait une erreur
L'ajout de json.dumps a commencé à créer un JSON correctement formaté et à résoudre le problème.
la source
Utilisez la
eval
fonction.Il prend en charge l'écart entre les guillemets simples et doubles.
la source
Comme les autres réponses l'expliquent bien, l'erreur se produit en raison de caractères de guillemet non valides passés au module json.
Dans mon cas, j'ai continué à obtenir ValueError même après avoir remplacé
'
par"
dans ma chaîne. Ce que j'ai finalement réalisé, c'est que certains symboles Unicode ressemblant à des guillemets avaient trouvé leur chemin dans ma chaîne:Pour nettoyer tout cela, vous pouvez simplement passer votre chaîne à travers une expression régulière:
la source
J'ai rencontré ce problème plusieurs fois lorsque le JSON a été modifié à la main. Si quelqu'un devait supprimer quelque chose du fichier sans s'en apercevoir, cela peut générer la même erreur.
Par exemple, si votre dernier "}" JSON est manquant, il lancera la même erreur.
Donc, si vous modifiez votre fichier à la main, assurez-vous de le formater comme prévu par le décodeur JSON, sinon vous rencontrerez le même problème.
J'espère que cela t'aides!
la source
Il est toujours idéal d'utiliser la
json.dumps()
méthode. Pour me débarrasser de cette erreur, j'ai utilisé le code suivantla source