Bagaimana cara membangun objek JSON secara dinamis dengan Python?


274

Saya baru mengenal Python dan saya bermain dengan data JSON. Saya ingin secara dinamis membangun objek JSON dengan menambahkan beberapa nilai kunci ke objek JSON yang ada.

Saya mencoba yang berikut tetapi saya dapat TypeError: 'str' object does not support item assignment:

import json

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

print 'JSON: ', json_data

Jawaban:


554

Anda membangun objek sebelum menyandikannya ke string JSON:

import json

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

JSON adalah format serialisasi , data tekstual yang mewakili struktur. Bukan struktur itu sendiri.


2
Solusi Anda bekerja seperti pesona bagi saya. Saya tidak bisa mengerti arti dari baris terakhir Anda, bisakah Anda menjelaskannya sedikit. Terima kasih.
akki

6
@akki: OP mencoba memperlakukan string JSON (serangkaian karakter yang menyandikan objek) sebagai objek itu sendiri. Mereka mencoba menggunakan json_data['key'] = 'value', yang tidak akan berhasil karena json_databukan kamus Python.
Martijn Pieters

diberikan objek dapatkah seseorang mengubah objek menjadi JSON atau kamus entah bagaimana secara otomatis?
Charlie Parker

@CharlieParker: itu terlalu luas. Objek Python tidak begitu saja tercermin ke dalam JSON, karena JSON adalah format yang cukup terbatas dengan hanya beberapa tipe data. Ada banyak pertanyaan di sini pada SO yang sudah mencakup jenis objek spesifik dan JSON, seperti model Django atau SQLAlchemy, dll.
Martijn Pieters

1
@AlexJohnson: pip listmemberi Anda informasi yang sama dan dapat menampilkan JSON:pip list --format=json
Martijn Pieters

25

Anda dapat membuat kamus Python dan membuat serial menjadi JSON dalam satu baris dan itu bahkan tidak jelek.

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

21

Sudah ada solusi yang disediakan yang memungkinkan membangun kamus, (atau kamus bersarang untuk data yang lebih kompleks), tetapi jika Anda ingin membangun sebuah objek, maka mungkin coba 'ObjDict'. Ini memberi jauh lebih banyak kontrol atas json yang akan dibuat, misalnya mempertahankan pesanan, dan memungkinkan bangunan sebagai objek yang mungkin merupakan representasi yang disukai dari konsep Anda.

pip instal keberatan dulu.

from objdict import ObjDict

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

2
ini persis apa yang saya cari! Mengingat bahwa dikte tidak teratur, meskipun Anda dapat mengurutkan berdasarkan urutan alfabet saat menelepon json.dumpsyaitu json.dumps(response, sort_keys=True, indent=4), tetapi kemudian Anda terjebak dengan urutan alfabet dan bukan urutan, pengelompokan, dan representasi pilihan Anda
Jonathan

11

Anda dapat menggunakan EasyDictperpustakaan ( doc ) :

EasyDict memungkinkan untuk mengakses nilai dict sebagai atribut (berfungsi secara rekursif). Sebuah properti mirip-Javascript notasi titik untuk dicts python.

PENGGUNAAN

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

[ Instalasi ]:

  • pip install easydict

Benyamin, bisakah Anda mengedit contoh Anda untuk menunjukkan penggunaan dengan dumps JSON dan banyak?
Thom Ives

7

Semua jawaban sebelumnya benar, berikut adalah satu lagi dan cara mudah untuk melakukannya. Misalnya, buat struktur data Dict untuk membuat serial dan deserialize objek

( Perhatikan Tidak ada yang Null dalam python dan saya sengaja menggunakan ini untuk menunjukkan bagaimana Anda dapat menyimpan null dan mengubahnya menjadi 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)

masukkan deskripsi gambar di sini

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.