繁体   English   中英

在python中的嵌套json中设置值的优雅方法

[英]Elegant way to set values in a nested json in python

我正在嵌套JSON中设置一些值。 在JSON中,不必总是存在键。
我的示例代码如下所示。

if 'key' not in data:
    data['key'] = {}
if 'nested_key' not in data['key']:
    data['key']['nested_key'] = some_value

还有其他优雅的方法可以实现这一目标吗? 只要不分配值if's想- data['key']['nested_key'] = some_value有时会抛出KeyError

我在StackOverflow上提到了多个有关“获取嵌套JSON”的类似问题,但没有一个满足我的要求。 因此,我添加了一个新问题。 万一这是一个重复的问题,那么一旦指导正确的问题,我将删除这个问题。

谢谢

请注意,对于插入,您无需检查密钥,您可以直接添加它。 但是,可以使用defaultdict。 对于列表之类的值,它特别有用。

from collections import defaultdict

data = defaultdict(dict)
data['key']['nested_key'] = some_value

defaultdict将确保您永远不会遇到关键错误。 如果该键不存在,它将返回一个类型已初始化的空对象。

基于列表的示例:

from collections import defaultdict

data = defaultdict(list)
data['key'].append(1)

否则必须像下面这样进行:

data = {}
if 'key' not in data:
    data['key'] = ['1']
else:
    data['key'].append('2')

基于现有字典的示例:

from collections import defaultdict

data = {'key1': 'sample'}    
data_new = defaultdict(dict,data)    
data_new['key']['something'] = 'nothing'

print data_new

输出:

defaultdict(<type 'dict'>, {'key1': 'sample', 'key': {'something': 'nothing'}})

您可以写一个语句:

data.setdefault('key', {})['nested_value'] = some_value

但我不确定它看起来是否更优雅。

PS:如果您喜欢使用Jay提议的defaultdict,则可以使用json.loads()返回的原始字典来初始化新字典,然后将其传递给json.dumps()

data2 = defaultdict(dict, data)
data2['key'] = value
json.dumps(data2)    # print the expected dict

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM