web-dev-qa-db-fra.com

python JSON doit être str, octets ou bytearray, et non 'dict

Dans Python 3, pour charger json précédemment enregistré comme ceci:

json.dumps(dictionary)

la sortie est quelque chose comme

{"('Hello',)": 6, "('Hi',)": 5}

quand j'utilise

json.loads({"('Hello',)": 6, "('Hi',)": 5})

ça ne marche pas, ça arrive:

TypeError: l'objet JSON doit être str, octets ou bytearray, pas 'dict'

24
dila93

json.loads Prend une chaîne en entrée et renvoie un dictionnaire en sortie.

json.dumps Prend un dictionnaire en entrée et retourne une chaîne en sortie.


Avec json.loads({"('Hello',)": 6, "('Hi',)": 5}),

Vous appelez json.loads Avec un dictionnaire en entrée.

Vous pouvez résoudre le problème comme suit (même si je ne suis pas tout à fait certain de l'intérêt de cela):

d1 = {"('Hello',)": 6, "('Hi',)": 5}
s1 = json.dumps(d1)
d2 = json.loads(s1)
42
barak manos

Vous passez un dictionnaire à une fonction qui attend une chaîne.

Cette syntaxe:

{"('Hello',)": 6, "('Hi',)": 5}

est à la fois un littéral de dictionnaire Python valide et un littéral d'objet JSON valide. Mais loads ne prend pas de dictionnaire; il prend une chaîne, qu'il interprète ensuite en tant que JSON et renvoie le résultat en tant que un dictionnaire (ou une chaîne ou un tableau ou un nombre, selon le JSON, mais généralement un dictionnaire).

Si vous passez cette chaîne à loads:

'''{"('Hello',)": 6, "('Hi',)": 5}'''

alors, il retournera un dictionnaire qui ressemble beaucoup à celui que vous essayez de lui transmettre.

Vous pouvez également exploiter la similarité des littéraux d'objet JSON avec les littéraux de dictionnaire Python en procédant comme suit:

json.loads(str({"('Hello',)": 6, "('Hi',)": 5}))

Mais dans les deux cas, vous récupéreriez simplement le dictionnaire que vous êtes en train de transmettre. Je ne suis donc pas sûr de ce qu'il permettrait d'accomplir. Quel est ton but?

6
Mark Reed