Python ile dinamik olarak bir JSON nesnesi nasıl oluşturulur?


274

Python'da yeniyim ve JSON verileriyle oynuyorum. Dinamik olarak mevcut bir JSON nesnesine bazı anahtar / değer çiftini ekleyerek bir JSON nesnesi oluşturmak istiyorum.

Aşağıdakileri denedim ama anladım TypeError: 'str' object does not support item assignment:

import json

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

print 'JSON: ', json_data

Yanıtlar:


553

Nesneyi bir JSON dizesine kodlamadan önce oluşturursunuz :

import json

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

JSON serileştirme biçimidir, bir yapıyı temsil eden metinsel verilerdir . Kendisi bu yapı değildir.


2
Çözümünüz benim için bir cazibe gibi çalıştı. Yine de son hattınızın anlamını anlayamadım, lütfen biraz ayrıntı verebilir misiniz? Teşekkürler.
akki

6
@akki: OP JSON dizesini (bir nesneyi kodlayan bir dizi karakter) nesnenin kendisi olarak ele almaya çalıştı. Kullanmaya çalıştılar json_data['key'] = 'value', bu json_databir Python sözlüğü olmadığı için çalışmayacak .
Martijn Pieters

bir nesne verilen biri otomatik olarak JSON veya sözlük bir şekilde dönüştürebilirsiniz?
Charlie Parker

@CharlieParker: bu çok geniş. Python nesneleri JSON'a yansıtılamaz, çünkü JSON sadece birkaç veri türüyle oldukça sınırlı bir formattır. Burada, Django veya SQLAlchemy modelleri vb. Gibi belirli nesne türlerini ve JSON'u kapsayan SO üzerinde zaten bir sürü soru var
Martijn Pieters

1
@AlexJohnson: pip listsize aynı bilgileri verir ve JSON çıktısını alabilirsiniz:pip list --format=json
Martijn Pieters

24

Python sözlüğünü oluşturabilir ve tek satırda JSON'a serileştirebilirsiniz ve bu çirkin bile değil.

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

21

Bir sözlük (veya daha karmaşık veriler için iç içe sözlük) oluşturmaya izin veren bir çözüm zaten var, ancak bir nesne oluşturmak istiyorsanız, belki de 'ObjDict'i deneyin. Bu, oluşturulacak json üzerinde çok daha fazla kontrol sağlar, örneğin tutma sırası ve kavramınızın tercih edilen bir temsili olabilecek bir nesne olarak bina oluşturmaya izin verir.

önce pip install itirazı.

from objdict import ObjDict

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

2
tam da aradığım şey buydu! Dicts sırasız olduğu göz önüne alındığında, json.dumpsyani çağrı yaparken alfabetik sıraya göre sıralayabilirsiniz json.dumps(response, sort_keys=True, indent=4), ancak daha sonra tercih ettiğiniz sipariş, gruplama ve temsil ile değil alfabetik sırayla sıkışmışsınız
Jonathan

11

EasyDictKütüphaneyi ( doc ) kullanabilirsiniz :

EasyDict, dict değerlerine nitelik olarak erişilmesini sağlar (özyinelemeli olarak çalışır). Python dikteleri için Javascript benzeri özellikler nokta gösterimi.

useagenin

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

[ Kurulum ]:

  • pip install easydict

Benyamin, JSON dökümleri ve yükleri ile kullanımı göstermek için lütfen örneğinizi düzenleyebilir misiniz?
Thom Ives

7

Önceki tüm cevaplar doğrudur, işte bunu yapmanın bir ve daha kolay yolu. Örneğin, bir nesneyi serileştirmek ve serisini kaldırmak için bir Dict veri yapısı oluşturun

( Dikkat Python hiçbiri boş ve ben null depolamak ve json null dönüştürmek nasıl göstermek için bilerek kullanıyorum)

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)

resim açıklamasını buraya girin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.