在 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.

我在 Whosebug 上提到了多个关于 "getting nested JSON" 的类似问题,但 none 满足了我的要求。所以我添加了一个新问题。以防万一,这是一个重复的问题,一旦找到正确的问题,我就会删除这个问题。

谢谢

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

from collections import defaultdict

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

defaultdict 将确保您永远不会出现按键错误。如果密钥不存在,它 returns 一个您初始化它所用类型的空对象。

基于列表的示例:

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()返回的原始dict初始化新的dict,然后将其传递给json.dumps()

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