Come costruire dinamicamente un oggetto JSON con Python?


274

Sono nuovo di Python e sto giocando con i dati JSON. Vorrei costruire dinamicamente un oggetto JSON aggiungendo un valore-chiave a un oggetto JSON esistente.

Ho provato quanto segue ma ottengo TypeError: 'str' object does not support item assignment:

import json

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

print 'JSON: ', json_data

Risposte:


554

Si crea l'oggetto prima di codificarlo in una stringa JSON:

import json

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

JSON è un formato di serializzazione , dati testuali che rappresentano una struttura. Non è essa stessa quella struttura.


2
La tua soluzione ha funzionato come un incanto per me. Non riuscivo a capire il significato della tua ultima riga, potresti per favore spiegarlo un po '. Grazie.
Akki

6
@akki: l'OP ha provato a trattare la stringa JSON (una serie di caratteri che codificano un oggetto) come l'oggetto stesso. Hanno provato a usare json_data['key'] = 'value', che non funzionerà perché json_datanon è un dizionario Python.
Martijn Pieters

dato un oggetto si può trasformare l'oggetto in JSON o in un dizionario in qualche modo automaticamente?
Charlie Parker,

@CharlieParker: è troppo ampio. Gli oggetti Python non si riflettono semplicemente in JSON, poiché JSON è un formato piuttosto limitato con solo pochi tipi di dati. Ci sono molte domande qui su SO già che riguardano tipi di oggetti specifici e JSON, come modelli Django o SQLAlchemy, ecc.
Martijn Pieters

1
@AlexJohnson: pip listti dà le stesse informazioni e può generare JSON:pip list --format=json
Martijn Pieters

25

Puoi creare il dizionario Python e serializzarlo su JSON in una riga e non è nemmeno brutto.

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

21

Esiste già una soluzione che consente di creare un dizionario (o dizionario nidificato per dati più complessi), ma se si desidera creare un oggetto, provare forse 'ObjDict'. Questo dà molto più controllo sul json da creare, ad esempio mantenendo l'ordine, e consente la costruzione come oggetto che può essere una rappresentazione preferita del tuo concetto.

pip installa objdict prima.

from objdict import ObjDict

data = ObjDict()
data.key = 'value'
json_data = data.dumps()

2
Questo e 'esattamente quello che stavo cercando! Dato che i dicts non sono ordinati, anche se potresti chiamare in ordine alfabetico quando chiami json.dumpscioè json.dumps(response, sort_keys=True, indent=4), ma poi sei bloccato con l'ordine alfabetico e non il tuo ordine, raggruppamento e rappresentazione preferito
Jonathan,

11

È possibile utilizzare la EasyDictlibreria ( doc ) :

EasyDict consente di accedere ai valori di dict come attributi (funziona in modo ricorsivo). Una notazione a punti delle proprietà simile a Javascript per i python dicts.

useage

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

[ Installazione ]:

  • pip install easydict

Benyamin, potresti modificare il tuo esempio per mostrare l'utilizzo con i dump e i carichi JSON?
Thom Ives,

7

Tutte le risposte precedenti sono corrette, ecco un altro modo semplice per farlo. Ad esempio, creare una struttura di dati Dict per serializzare e deserializzare un oggetto

( Nota: None è Null in Python e lo sto usando intenzionalmente per dimostrare come è possibile archiviare null e convertirlo in 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)

inserisci qui la descrizione dell'immagine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.