如何动态构建JSON对象?

359 投票
8 回答
699704 浏览
提问于 2025-04-18 02:58

我刚开始学习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 一行代码搞定,而且不需要额外安装什么东西,使用 SimpleNamespaceobject_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本身并不是那个结构。

撰写回答