我在嵌套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:如果你喜欢使用defaultdict所提议的周杰伦,你可以初始化与json.loads()
返回原来的一个新的字典,然后传递它json.dumps()
:
data2 = defaultdict(dict, data)
data2['key'] = value
json.dumps(data2) # print the expected dict