web-dev-qa-db-fra.com

Python / Json: Nom de propriété en attente entre guillemets

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"}]}}

vers le backend où il sera reçu sous forme de chaîne, puis j’ai utilisé json.loads(data) pour l’analyser.

Mais à chaque fois, j'ai 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 en dehors de cette solution json.loads(json.dumps(data)) qui me semble personnellement peu 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.

50
raeX

Cette:

{'http://example.org/about': {'http://purl.org/dc/terms/title': [{'type': 'literal', 'value': "Anna's Homepage"}]}}

n'est pas JSON.
Cette:

{"http://example.org/about": {"http://purl.org/dc/terms/title": [{"type": "literal", "value": "Anna's Homepage"}]}}

est JSON.

91
ElmoVanKielmo

comme JSON n'autorise que les chaînes entre guillemets, vous pouvez manipuler la chaîne de la manière suivante:

str = str.replace("\'", "\"")

Ceci remplacera toutes les occurrences de guillemets simples par des guillemets doubles dans la chaîne JSON str.

Vous pouvez également utiliser js-beautify qui est moins strict:

$ pip install jsbeautifier
$ js-beautify file.js
21
elig

Les chaînes JSON doivent utiliser des guillemets doubles. La bibliothèque JSON python applique cette règle afin que vous ne puissiez pas charger votre chaîne. Vos données doivent ressembler à ceci:

{"http://example.org/about": {"http://purl.org/dc/terms/title": [{"type": "literal", "value": "Anna's Homepage"}]}}

Si ce n'est pas quelque chose que vous pouvez faire, vous pouvez utiliser ast.literal_eval() au lieu de json.loads()

6
alexbclay

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.

5
Daniel Roseman

J'ai utilisé cette méthode et j'ai réussi à obtenir le résultat souhaité. mon script

x = "{'inner-temperature': 31.73, 'outer-temperature': 28.38, 'keys-value': 0}"

x = x.replace("'", '"')
j = json.loads(x)
print(j['keys-value'])

sortie

>>> 0
4
Hamed

J'ai vérifié vos données JSON

{'http://example.org/about': {'http://purl.org/dc/terms/title': [{'type': 'literal', 'value': "Anna's Homepage"}]}}

dans http://jsonlint.com/ et les résultats sont les suivants:

Error: Parse error on line 1:
{   'http://example.org/
--^
Expecting 'STRING', '}', got 'undefined'

en le modifiant à la chaîne suivante, résolvez l'erreur JSON:

{
    "http://example.org/about": {
        "http://purl.org/dc/terms/title": [{
            "type": "literal",
            "value": "Anna's Homepage"
        }]
    }
}
4
Yaron

Dans mon cas, les guillemets n'étaient pas un problème.

La dernière virgule m'a donné le même message d'erreur.

{'a':{'b':c,}}
           ^

Pour supprimer cette virgule, j'ai écrit un code simple.

import json

with open('a.json','r') as f:
    s = f.read()
    s = s.replace('\t','')
    s = s.replace('\n','')
    s = s.replace(',}','}')
    s = s.replace(',]',']')
    data = json.loads(s)

Et cela a fonctionné pour moi.

3
greentec

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 passez n'est tout simplement pas un JSON valide. Il devrait ressembler à

{"http://example.org/about": {"http://purl.org/dc/terms/title": [{"type": "literal", "value": "Anna's Homepage"}]}}
2
Pavel Gurkov

J'ai eu le même problème. Deux composants communiquant l'un avec l'autre utilisaient une file d'attente.

Le premier composant ne faisait pas json.dumps avant de mettre le message en file d'attente. Ainsi, la chaîne JSON générée par le composant récepteur était entre guillemets simples. Cela causait une erreur

 Expecting property name enclosed in double quotes

L'ajout de json.dumps a commencé à créer un problème JSON correctement résolu et résolu.

0
Rahul Bagal