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

时间:2019-02-06 05:20:15

标签: python json code-cleanup

我正在嵌套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”的类似问题,但没有一个满足我的要求。因此,我添加了一个新问题。万一这是一个重复的问题,那么一旦指导正确的问题,我将删除这个问题。

谢谢

2 个答案:

答案 0 :(得分:4)

请注意,对于插入,您无需检查密钥,您可以直接添加它。但是,可以使用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'}})

答案 1 :(得分:2)

您可以写一个语句:

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

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

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

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