Conversion du dictionnaire en JSON

348
r = {'is_claimed': 'True', 'rating': 3.5}
r = json.dumps(r)
file.write(str(r['rating']))

Je ne peux pas accéder à mes données dans le JSON. Qu'est-ce que je fais mal?

TypeError: string indices must be integers, not str
sheetal_158
la source

Réponses:

536

json.dumps()convertit un dictionnaire en strobjet, pas en json(dict)objet! Vous devez donc charger votre strdans un dictpour l'utiliser en utilisant la json.loads()méthode

Voir json.dumps()comme méthode de sauvegarde et json.loads()comme méthode de récupération.

Voici l'exemple de code qui pourrait vous aider à mieux le comprendre:

import json

r = {'is_claimed': 'True', 'rating': 3.5}
r = json.dumps(r)
loaded_r = json.loads(r)
loaded_r['rating'] #Output 3.5
type(r) #Output str
type(loaded_r) #Output dict
Iman Mirzadeh
la source
11
ne pensez-vous pas qu'il est un peu inefficace de charger le json dans une variable distincte loaded_r, étant donné que vous l'avez déjà fait r?
Tim
Salut! Je me rends compte que c'est une réponse très ancienne, mais j'espérais que vous pourriez éclaircir une chose. @TimCastelijns a mentionné qu'il est inefficace de recharger le json dans une nouvelle variable Load_r. Est-ce que le moyen efficace de le faire serait de simplement déclarer r = json.loads (r)?
SchrodingersStat
2
@SchrodingersStat Salut. Je ne pense pas que cela change beaucoup les performances. Vous pouvez vérifier en utilisant la fonction «timeit». Si vous voulez vraiment un chargement / vidage json rapide, vous pouvez utiliser la bibliothèque 'ujson'!
Iman Mirzadeh
14
Je soupçonne que @TimCastelijns a mal compris l'intention d'Imran. Le JSON est chargé dans une nouvelle variable non pas parce qu'il s'agit de nouvelles informations, mais pour montrer que les valeurs dans le nouveau dictionnaire, c'est-à-dire après le codage et le décodage JSON aller-retour, sont identiques.
dumbledad
43

json.dumps()renvoie la représentation sous forme de chaîne JSON du dict python. Voir les documents

Vous ne pouvez pas faire r['rating']parce que r est une chaîne, plus un dict

Peut-être que vous vouliez dire quelque chose comme

r = {'is_claimed': 'True', 'rating': 3.5}
json = json.dumps(r) # note i gave it a different name
file.write(str(r['rating']))
Tim
la source
2

Pas besoin de le convertir en chaîne en utilisant json.dumps()

r = {'is_claimed': 'True', 'rating': 3.5}
file.write(r['is_claimed'])
file.write(str(r['rating']))

Vous pouvez obtenir les valeurs directement à partir de l'objet dict.

user3273866
la source
1

Définir r comme dictionnaire devrait faire l'affaire:

>>> r: dict = {'is_claimed': 'True', 'rating': 3.5}
>>> print(r['rating'])
3.5
>>> type(r)
<class 'dict'>
Aslan
la source