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