如何动态构建JSON对象?
我刚开始学习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
8 个回答
14
你可以使用 EasyDict
库 (文档):
EasyDict 让你可以像访问对象属性一样访问字典里的值(它会递归工作)。这就像在 JavaScript 中用点号来访问属性一样,但这是用在 Python 的字典上。
使用方法
>>> 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
21
json.loads
是用来把一个字符串转换成字典的。json.dumps
则是把一个字典转换成字符串。
如果你想把JSON数据转换成Python对象,可以用 Python3
一行代码搞定,而且不需要额外安装什么东西,使用 SimpleNamespace
和 object_hook
就可以了:
从字符串转换
import json
from types import SimpleNamespace
string = '{"foo":3, "bar":{"x":1, "y":2}}'
# Parse JSON into an object with attributes corresponding to dict keys.
x = json.loads(string, object_hook=lambda d: SimpleNamespace(**d))
print(x.foo)
print(x.bar.x)
print(x.bar.y)
输出结果:
3
1
2
从文件转换:
JSON对象:data.json
{
"foo": 3,
"bar": {
"x": 1,
"y": 2
}
}
import json
from types import SimpleNamespace
with open("data.json") as fh:
string = fh.read()
# Parse JSON into an object with attributes corresponding to dict keys.
x = json.loads(string, object_hook=lambda d: SimpleNamespace(**d))
print(x.foo)
print(x.bar.x)
print(x.bar.y)
输出结果:
3
1
2
从请求获取:
import json
from types import SimpleNamespace
import requests
r = requests.get('https://api.github.com/users/MilovanTomasevic')
# Parse JSON into an object with attributes corresponding to dict keys.
x = json.loads(r.text, object_hook=lambda d: SimpleNamespace(**d))
print(x.name)
print(x.company)
print(x.blog)
输出结果:
Milovan Tomašević
NLB
milovantomasevic.com
如果你想更方便、更快速地获取API的JSON响应,可以看看 这个回答。
25
这里已经有一个解决方案,可以用来构建字典(或者更复杂的数据结构,像嵌套字典),但是如果你想构建一个对象的话,可以试试'ObjDict'。这个工具能让你对要创建的json有更多的控制,比如保持顺序,并且可以以对象的形式构建,这可能更符合你想表达的概念。
首先,你需要运行命令:pip install objdict。
from objdict import ObjDict
data = ObjDict()
data.key = 'value'
json_data = data.dumps()
42
你可以用一行代码创建一个Python字典,并把它转换成JSON格式,而且看起来也不复杂。
my_json_string = json.dumps({'key1': val1, 'key2': val2})
726
你需要在把对象转换成JSON字符串之前,先构建这个对象:
import json
data = {}
data['key'] = 'value'
json_data = json.dumps(data)
JSON是一种序列化格式,它是用文本来表示一个结构。换句话说,JSON本身并不是那个结构。