优雅的方式在Python中的嵌套JSON设定值

问题描述 投票:0回答:2

我在嵌套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”多个类似的问题,但没有满足我的要求。所以我添加了一个新的问题。在情况下,这是一个重复的问题,然后我就删除这个曾经引向正确的问题。

谢谢

python json code-cleanup
2个回答
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'}})

2
投票

您可以在一个声明中写道:

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

但我不知道它看起来更优雅。

PS:如果你喜欢使用defaultdict所提议的周杰伦,你可以初始化与json.loads()返回原来的一个新的字典,然后传递它json.dumps()

data2 = defaultdict(dict, data)
data2['key'] = value
json.dumps(data2)    # print the expected dict
© www.soinside.com 2019 - 2024. All rights reserved.