Comment construire dynamiquement un objet JSON avec Python?

274

Je suis nouveau sur Python et je joue avec des données JSON. Je voudrais construire dynamiquement un objet JSON en ajoutant une valeur-clé à un objet JSON existant.

J'ai essayé ce qui suit mais j'obtiens TypeError: 'str' object does not support item assignment:

import json

json_data = json.dumps({})
json_data["key"] = "value"

print 'JSON: ', json_data
Backo
la source

Réponses:

554

Vous créez l'objet avant de le coder en une chaîne JSON:

import json

data = {}
data['key'] = 'value'
json_data = json.dumps(data)

JSON est un format de sérialisation , des données textuelles représentant une structure. Ce n'est pas, en soi, cette structure.

Martijn Pieters
la source
2
Votre solution a fonctionné comme un charme pour moi. Je ne pouvais pas comprendre le sens de votre dernière ligne, pourriez-vous s'il vous plaît développer un peu. Merci.
akki
6
@akki: l'OP a essayé de traiter la chaîne JSON (une série de caractères qui codent un objet) comme l'objet lui-même. Ils ont essayé d'utiliser json_data['key'] = 'value', ce qui ne fonctionnera pas car ce json_datan'est pas un dictionnaire Python.
Martijn Pieters
étant donné un objet, peut-on transformer l'objet en JSON ou en dictionnaire en quelque sorte automatiquement?
Charlie Parker
@CharlieParker: c'est beaucoup trop large. Les objets Python ne sont pas simplement reflétés dans JSON, car JSON est un format assez limité avec seulement quelques types de données. Il y a déjà beaucoup de questions ici sur SO qui couvrent des types d'objets spécifiques et JSON, tels que les modèles Django ou SQLAlchemy, etc.
Martijn Pieters
1
@AlexJohnson: pip listvous donne les mêmes informations et peut produire du JSON:pip list --format=json
Martijn Pieters
25

Vous pouvez créer le dictionnaire Python et le sérialiser en JSON sur une seule ligne et ce n'est même pas moche.

my_json_string = json.dumps({'key1': val1, 'key2': val2})
sscarduzio
la source
21

Il existe déjà une solution qui permet de construire un dictionnaire (ou un dictionnaire imbriqué pour des données plus complexes), mais si vous souhaitez construire un objet, essayez peut-être 'ObjDict'. Cela donne beaucoup plus de contrôle sur le json à créer, par exemple en conservant l'ordre, et permet de construire comme un objet qui peut être une représentation préférée de votre concept.

pip installe objdict en premier.

from objdict import ObjDict

data = ObjDict()
data.key = 'value'
json_data = data.dumps()
innov8
la source
2
Ceci est exactement ce que je cherchais! Étant donné que les pronostics ne sont pas ordonnés, vous pouvez trier par ordre alphabétique lors de l'appel, json.dumpsc'est-à json.dumps(response, sort_keys=True, indent=4)- dire que vous êtes bloqué par ordre alphabétique et non par votre ordre, groupe et représentation préférés
Jonathan
11

Vous pouvez utiliser la EasyDictbibliothèque ( doc ) :

EasyDict permet d'accéder aux valeurs de dict en tant qu'attributs (fonctionne récursivement). Une notation par points de propriétés de type Javascript pour les textes python.

UTILISATION

>>> from easydict import EasyDict as edict
>>> d = edict({'foo':3, 'bar':{'x':1, 'y':2}})
>>> d.foo
3
>>> d.bar.x
1

>>> d = edict(foo=3)
>>> d.foo
3

[ Installation ]:

  • pip install easydict
Benyamin Jafari
la source
Benyamin, pourriez-vous s'il vous plaît modifier votre exemple pour montrer l'utilisation avec les vidages et les charges JSON?
Thom Ives
7

Toutes les réponses précédentes sont correctes, voici un moyen de plus et facile de le faire. Par exemple, créez une structure de données Dict pour sérialiser et désérialiser un objet

( Remarquez que None est Null en python et je l'utilise intentionnellement pour montrer comment vous pouvez stocker null et le convertir en json null)

import json
print('serialization')
myDictObj = { "name":"John", "age":30, "car":None }
##convert object to json
serialized= json.dumps(myDictObj, sort_keys=True, indent=3)
print(serialized)
## now we are gonna convert json to object
deserialization=json.loads(serialized)
print(deserialization)

entrez la description de l'image ici

grepit
la source