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

Bac*_*cko 244 python 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
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 495

在将对象编码为JSON字符串之前构建对象:

import json

data = {}
data['key'] = 'value'
json_data = json.dumps(data)
Run Code Online (Sandbox Code Playgroud)

JSON是一种序列化格式,表示结构的文本数据.它本身并不是那种结构.

  • @akki:OP试图将JSON字符串(一系列编码对象的字符)视为对象本身.他们试图使用`json_data ['key'] ='value'`,这是行不通的,因为`json_data`不是Python字典. (6认同)
  • 您的解决方案对我来说就像是一种魅力。不过,我无法理解您最后一行的含义,请您详细说明一下。谢谢。 (2认同)

Mil*_*vić 21

    \n
  • json.loads将字符串作为输入并返回字典作为输出。
  • \n
  • json.dumps将字典作为输入并返回字符串作为输出。
  • \n
\n

如果您需要将 JSON 数据转换为 python 对象,可以Python3在一行中使用SimpleNamespace和来完成此操作,无需额外安装object_hook

\n

从字符串

\n
import json\nfrom types import SimpleNamespace\n\nstring = \'{"foo":3, "bar":{"x":1, "y":2}}\'\n\n# Parse JSON into an object with attributes corresponding to dict keys.\nx = json.loads(string, object_hook=lambda d: SimpleNamespace(**d))\n\nprint(x.foo)\nprint(x.bar.x)\nprint(x.bar.y)\n
Run Code Online (Sandbox Code Playgroud)\n

输出:

\n
3\n1\n2\n
Run Code Online (Sandbox Code Playgroud)\n

从文件:

\n

JSON 对象:data.json

\n
{\n    "foo": 3,\n    "bar": {\n        "x": 1,\n        "y": 2\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n
import json\nfrom types import SimpleNamespace\n\nwith open("data.json") as fh:\n    string = fh.read()\n\n# Parse JSON into an object with attributes corresponding to dict keys.\nx = json.loads(string, object_hook=lambda d: SimpleNamespace(**d))\n\nprint(x.foo)\nprint(x.bar.x)\nprint(x.bar.y)\n
Run Code Online (Sandbox Code Playgroud)\n

输出:

\n
3\n1\n2\n
Run Code Online (Sandbox Code Playgroud)\n

来自请求

\n
import json\nfrom types import SimpleNamespace\nimport requests\n\nr = requests.get(\'https://api.github.com/users/MilovanTomasevic\')\n\n# Parse JSON into an object with attributes corresponding to dict keys.\nx = json.loads(r.text, object_hook=lambda d: SimpleNamespace(**d))\n\nprint(x.name)\nprint(x.company)\nprint(x.blog)\n
Run Code Online (Sandbox Code Playgroud)\n

输出:

\n
Milovan Toma\xc5\xa1evi\xc4\x87\nNLB\nmilovantomasevic.com\n
Run Code Online (Sandbox Code Playgroud)\n

为了更美观、更快速地从 API 访问 JSON 响应,请查看此响应

\n


inn*_*ov8 20

已经提供了一个允许构建字典的解决方案(或者用于更复杂数据的嵌套字典),但是如果你想构建一个对象,那么也许可以尝试'ObjDict'.这样可以更好地控制要创建的json,例如保留顺序,并允许构建为可能是您概念的首选表示的对象.

pip首先安装objdict.

from objdict import ObjDict

data = ObjDict()
data.key = 'value'
json_data = data.dumps()
Run Code Online (Sandbox Code Playgroud)

  • 这正是我要找的!鉴于 dicts 是无序的,虽然你可以在调用 `json.dumps` ie `json.dumps(response, sort_keys=True, indent=4)` 时按字母顺序排序,但是你会被困在字母顺序而不是你的首选排序、分组和表示 (2认同)

ssc*_*zio 17

您可以创建Python字典并将其序列化为一行中的JSON,它甚至都不是丑陋的.

my_json_string = json.dumps({'key1': val1, 'key2': val2})
Run Code Online (Sandbox Code Playgroud)


Ben*_*ari 10

你可以使用EasyDict(doc):

EasyDict允许将dict值作为属性访问(递归工作​​).python dicts的类似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
Run Code Online (Sandbox Code Playgroud)

[ 安装 ]:

  • pip install easydict

  • Benyamin,您能否编辑您的示例以显示 JSON 转储和加载的用法? (2认同)

gre*_*pit 6

先前的所有答案都是正确的,这是一种更简单的方法。例如,创建一个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)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明