Jak dynamicznie budować obiekt JSON za pomocą Pythona?

274

Jestem nowy w Pythonie i bawię się danymi JSON. Chciałbym dynamicznie budować obiekt JSON, dodając pewną wartość klucza do istniejącego obiektu JSON.

Próbowałem następujące, ale otrzymuję TypeError: 'str' object does not support item assignment:

import json

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

print 'JSON: ', json_data
Backo
źródło

Odpowiedzi:

553

Budujesz obiekt przed zakodowaniem go w ciągu JSON:

import json

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

JSON to format serializacji , dane tekstowe reprezentujące strukturę. Nie jest to sama struktura.

Martijn Pieters
źródło
2
Twoje rozwiązanie działało dla mnie jak urok. Nie mogłem jednak zrozumieć znaczenia twojej ostatniej linii, czy mógłbyś to trochę rozwinąć. Dzięki.
akki,
6
@akki: OP próbował traktować ciąg JSON (ciąg znaków kodujący obiekt) jako sam obiekt. Próbowali użyć json_data['key'] = 'value', co nie będzie działać, ponieważ json_datanie jest słownikiem w języku Python.
Martijn Pieters
biorąc pod uwagę obiekt, czy można przekształcić obiekt w JSON lub słownik jakoś automatycznie?
Charlie Parker
@CharlieParker: to jest zbyt szerokie. Obiekty Pythona nie są tak prosto odzwierciedlane w JSON, ponieważ JSON jest dość ograniczonym formatem z kilkoma typami danych. Na SO już jest wiele pytań, które dotyczą określonych typów obiektów i JSON, takich jak modele Django lub SQLAlchemy itp.
Martijn Pieters
1
@AlexJohnson: pip listdaje te same informacje i może wysyłać JSON:pip list --format=json
Martijn Pieters
24

Możesz utworzyć słownik Pythona i serializować go do JSON w jednym wierszu i nie jest to nawet brzydkie.

my_json_string = json.dumps({'key1': val1, 'key2': val2})
sscarduzio
źródło
21

Jest już dostępne rozwiązanie, które pozwala zbudować słownik (lub zagnieżdżony słownik dla bardziej złożonych danych), ale jeśli chcesz zbudować obiekt, być może spróbuj „ObjDict”. Daje to znacznie większą kontrolę nad tworzonym Jsonem, na przykład zachowuje porządek i pozwala budować jako obiekt, który może być preferowaną reprezentacją twojej koncepcji.

najpierw zainstaluj objdict pip.

from objdict import ObjDict

data = ObjDict()
data.key = 'value'
json_data = data.dumps()
innov8
źródło
2
właśnie tego szukałem! Biorąc pod uwagę, że dicts są nieuporządkowane, choć można sortować według kolejności alfabetycznej podczas wywoływania json.dumpstj json.dumps(response, sort_keys=True, indent=4), ale potem utkniesz w kolejności alfabetycznej, a nie preferowany zamawiania, grupowanie i reprezentacja
Jonathan
11

Możesz użyć EasyDictbiblioteki ( doc ) :

EasyDict pozwala na dostęp do wartości dykt jako atrybutów (działa rekurencyjnie). Notacja kropkowa dla właściwości pythonowych w stylu Javascript.

WYKORZYSTANIE

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

[ Instalacja ]:

  • pip install easydict
Benyamin Jafari
źródło
Benyamin, czy mógłbyś edytować swój przykład, aby pokazać użycie ze zrzutami i ładowaniami JSON?
Thom Ives,
7

Wszystkie poprzednie odpowiedzi są poprawne, oto jeszcze jeden i łatwy sposób, aby to zrobić. Na przykład utwórz strukturę danych Dict, aby serializować i deserializować obiekt

( Zauważ, że w Pythonie Żaden nie ma wartości Null i celowo używam tego, aby zademonstrować, jak możesz przechowywać wartość NULL i przekonwertować ją na 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)

wprowadź opis zdjęcia tutaj

grepit
źródło