![](/img/trans.png)
[英]Is there an elegant way to flatten nested JSON with a django serializer?
[英]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
。
我在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:如果您喜欢使用Jay提议的defaultdict,则可以使用json.loads()
返回的原始字典来初始化新字典,然后将其传递给json.dumps()
:
data2 = defaultdict(dict, data)
data2['key'] = value
json.dumps(data2) # print the expected dict
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.