วิธีการสร้างวัตถุ JSON ด้วย Python แบบไดนามิก?


274

ฉันยังใหม่กับ Python และฉันกำลังเล่นกับข้อมูล JSON ฉันต้องการสร้างวัตถุ JSON แบบไดนามิกโดยการเพิ่มคีย์ - ค่าบางอย่างให้กับวัตถุ JSON ที่มีอยู่

ฉันลองสิ่งต่อไปนี้ แต่ฉันได้รับTypeError: 'str' object does not support item assignment:

import json

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

print 'JSON: ', json_data

คำตอบ:


553

คุณสร้างวัตถุก่อนที่จะเข้ารหัสไปยังสตริง JSON:

import json

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

JSON เป็นรูปแบบการจัดลำดับข้อมูลที่เป็นข้อความที่แสดงถึงโครงสร้าง มันไม่ได้เป็นโครงสร้างของตัวเอง


2
โซลูชันของคุณทำงานได้อย่างมีเสน่ห์สำหรับฉัน ฉันไม่สามารถเข้าใจความหมายของบรรทัดสุดท้ายของคุณได้โปรดอธิบายเพิ่มเติมหน่อยได้ไหม ขอบคุณ
akki

6
@akki: OP พยายามปฏิบัติกับสตริง JSON (ชุดอักขระที่เข้ารหัสวัตถุ) เป็นวัตถุเอง พวกเขาพยายามใช้json_data['key'] = 'value'ซึ่งจะไม่ทำงานเพราะjson_dataไม่ใช่พจนานุกรม Python
Martijn Pieters

ให้วัตถุสามารถแปลงวัตถุเป็น JSON หรือพจนานุกรมอย่างใดโดยอัตโนมัติ
Charlie Parker

@CharlieParker: นั่นเป็นวิธีที่กว้างเกินไป วัตถุ Python ไม่ได้สะท้อนให้เห็นอย่างง่ายๆใน JSON เนื่องจาก JSON นั้นค่อนข้างมีรูปแบบที่ จำกัด โดยมีชนิดข้อมูลเพียงไม่กี่ชนิด มีคำถามมากมายเกี่ยวกับ SO อยู่แล้วที่ครอบคลุมประเภทวัตถุเฉพาะและ JSON เช่น Django หรือ SQLAlchemy model เป็นต้น
Martijn Pieters

1
@AlexJohnson: pip listให้ข้อมูลเดียวกันกับคุณและสามารถแสดงผล JSON:pip list --format=json
Martijn Pieters

24

คุณสามารถสร้างพจนานุกรม Python และทำให้เป็นอนุกรมกับ JSON ในหนึ่งบรรทัดและไม่น่าเกลียดแม้แต่น้อย

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

21

มีวิธีแก้ไขที่ให้มาซึ่งอนุญาตให้สร้างพจนานุกรม (หรือพจนานุกรมที่ซ้อนกันสำหรับข้อมูลที่ซับซ้อนมากขึ้น) แต่ถ้าคุณต้องการสร้างวัตถุอาจลอง 'ObjDict' สิ่งนี้ให้การควบคุม json ที่จะสร้างได้มากขึ้นตัวอย่างเช่นการรักษาลำดับและอนุญาตให้สร้างเป็นวัตถุซึ่งอาจเป็นตัวแทนของแนวคิดของคุณ

pip ติดตั้ง objdict ก่อน

from objdict import ObjDict

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

2
นี่คือสิ่งที่ฉันกำลังมองหา! ระบุว่าไม่มีการเรียงลำดับ dicts แม้ว่าคุณสามารถเรียงตามลำดับตัวอักษรเมื่อโทรjson.dumpsเช่นjson.dumps(response, sort_keys=True, indent=4)แต่แล้วคุณก็ติดอยู่กับลำดับตัวอักษรและไม่ใช่ลำดับที่คุณต้องการจัดกลุ่มและเป็นตัวแทน
Jonathan

11

คุณสามารถใช้EasyDictห้องสมุด( doc ) :

EasyDict อนุญาตให้เข้าถึงค่า dict เป็นคุณลักษณะ (ใช้งานซ้ำ) สัญกรณ์ที่มีลักษณะเหมือน Javascript เป็นจุดสำหรับ pic 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

[การติดตั้ง ]:

  • pip install easydict

เบนิยามินคุณช่วยแก้ไขตัวอย่างของคุณเพื่อแสดงการใช้งานด้วยการทิ้ง JSON และโหลดได้หรือไม่?
Thom Ives

7

คำตอบก่อนหน้าทั้งหมดถูกต้องนี่เป็นอีกวิธีหนึ่งที่ทำได้ง่าย ตัวอย่างเช่นสร้างโครงสร้างข้อมูล Dict เพื่อทำให้เป็นอันดับและ deserialize วัตถุ

(การแจ้งให้ทราบว่าไม่มีเป็นโมฆะในงูหลามและฉันตั้งใจใช้สิ่งนี้เพื่อสาธิตวิธีที่คุณสามารถจัดเก็บโมฆะและแปลงเป็น 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)

ป้อนคำอธิบายรูปภาพที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.