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

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.


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})

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()

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, 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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.