如何使用Python动态构建JSON对象?


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

Answers:


553

您在将对象编码为JSON字符串之前先对其进行构建:

import json

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

JSON是序列化格式,文本数据表示结构。它本身不是那个结构。


2
您的解决方案对我来说就像是一种魅力。不过,我不明白您最后一行的含义,请您详细说明一下。谢谢。
akki 2015年

6
@akki:OP尝试将JSON字符串(编码对象的一系列字符)视为对象本身。他们尝试使用json_data['key'] = 'value',但由于json_data不是Python字典,因此无法使用。
马丁·彼得斯

给定一个对象,可以自动将其转换为JSON或字典吗?
查理·帕克

@CharlieParker:太宽泛了。Python对象不能简单地反映到JSON中,因为JSON是一种有限的格式,仅包含少数几种数据类型。有很多的问题,在这里已经SO覆盖特定对象类型和JSON,如Django的SQLAlchemy的或模型等
的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
这正是我想要的!鉴于字典是无序的,尽管您可以在调用json.dumpsie 时按字母顺序进行排序json.dumps(response, sort_keys=True, indent=4),但是您会陷入字母顺序,而不是首选的顺序,分组和表示方式
Jonathan

11

您可以使用EasyDictdoc

EasyDict允许将字典值作为属性访问(递归工作​​)。python dict的类似于Javascript的属性点表示法。

使用方法

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

Benyamin,能否请您编辑示例以显示JSON转储和加载的用法?
Thom Ives

7

以前的所有答案都是正确的,这是一种更简单的方法。例如,创建一个Dict数据结构来序列化和反序列化一个对象

请注意,Python中None是Null,我有意使用它来演示如何存储null并将其转换为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)

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.