Python 获取深度未知的任意字典中的键值
我有一本深度和结构未知的词典。它可能包含更多的字典、字典列表等。它是通过反序列化另一个系统创建的一些JSON输入创建的。在字典的不同位置有一个键,可能有多个同名键。我希望获得每个键的值,并理想地更新它们 给定如下目录结构:Python 获取深度未知的任意字典中的键值,python,json,dictionary,Python,Json,Dictionary,我有一本深度和结构未知的词典。它可能包含更多的字典、字典列表等。它是通过反序列化另一个系统创建的一些JSON输入创建的。在字典的不同位置有一个键,可能有多个同名键。我希望获得每个键的值,并理想地更新它们 给定如下目录结构: { "tags":{ "social-1":{ "email":True, "twitter":True, "facebook":True, "linkedin":True, "type":"social
{
"tags":{
"social-1":{
"email":True,
"twitter":True,
"facebook":True,
"linkedin":True,
"type":"social"
},
"primary":{
"type":"flexible",
"width":"auto",
"blocks":[
{
"type":"combo",
"data":{
"styles":{
"margin":"10",
"padding":"0",
"borderColor":"#000",
"borderWidth":"0",
"borderStyle":"solid",
"backgroundColor":"transparent",
"width":"auto"
},
"placeholder":True,
"headline":{
"visible":False
},
"subHeadline":{
"visible":False
},
"imageHolder":{
"visible":True,
"value":[
{
"url":None,
"caption":None,
"width":220,
"height":140,
"padding":10,
"alt":"",
"href":None,
"filePath":None,
"sizing":"original",
"source":"disk",
"displayWidth":200,
"displayHeight":140,
"displayPadding":{
"left":10,
"top":0,
"right":10,
"bottom":10
}
}
],
"smartSizing":True,
"captions":False,
"captionDefault":None
},
"content":{
"visible":True,
"value":"<p>Your text here.</p>"
},
"imagePosition":"left",
"textWrap":False,
"type":"combo"
}
},
{
"type":"image",
"data":{
"styles":{
"margin":"10",
"padding":"0",
"borderColor":"#000",
"borderWidth":"0",
"borderStyle":"solid",
"backgroundColor":"transparent",
"width":"auto"
},
"placeholder":False,
"imageHolder":[
{
"url":None,
"caption":None,
"width":0,
"height":140,
"padding":10,
"alt":"",
"href":None,
"filePath":None,
"sizing":"original",
"source":"disk",
"displayWidth":213,
"displayHeight":159,
"displayPadding":{
"left":10,
"top":10,
"right":5,
"bottom":10
}
},
{
"url":None,
"caption":None,
"width":0,
"height":140,
"padding":10,
"alt":"",
"href":None,
"filePath":None,
"displayWidth":213,
"displayHeight":159,
"source":"disk",
"sizing":"original",
"displayPadding":{
"left":5,
"top":10,
"right":5,
"bottom":10
}
},
{
"url":None,
"caption":None,
"width":0,
"height":140,
"padding":10,
"alt":"",
"href":None,
"filePath":None,
"displayWidth":213,
"displayHeight":159,
"source":"disk",
"sizing":"original",
"displayPadding":{
"left":5,
"top":10,
"right":10,
"bottom":10
}
}
],
"orientation":"horizontal",
"smartSizing":True,
"captions":False,
"captionDefault":None,
"type":"image"
}
}
]
}
}
}
{
“标签”:{
“社会-1”:{
“电子邮件”:没错,
“推特”:没错,
“脸谱”:没错,
“linkedin”:没错,
“类型”:“社会性”
},
“主要”:{
“类型”:“灵活”,
“宽度”:“自动”,
“区块”:[
{
“类型”:“组合”,
“数据”:{
“风格”:{
“保证金”:“10”,
“填充”:“0”,
“borderColor”:“000”,
“边框宽度”:“0”,
“边框样式”:“实心”,
“背景色”:“透明”,
“宽度”:“自动”
},
“占位符”:True,
“标题”:{
“可见”:错误
},
“分标题”:{
“可见”:错误
},
“图像持有人”:{
“可见”:真实,
“价值”:[
{
“url”:无,
“说明”:无,
“宽度”:220,
“高度”:140,
“填充”:10,
“alt”:“,
“href”:无,
“文件路径”:无,
“尺寸”:“原始”,
“source”:“磁盘”,
“显示宽度”:200,
“显示高度”:140,
“显示填充”:{
“左”:10,
“顶部”:0,
“对”:10,
“底部”:10
}
}
],
“SmartSize”:正确,
“标题”:错误,
“captionDefault”:无
},
“内容”:{
“可见”:真实,
“值”:“此处显示您的文本。”
},
“imagePosition”:“left”,
“textWrap”:False,
“类型”:“组合”
}
},
{
“类型”:“图像”,
“数据”:{
“风格”:{
“保证金”:“10”,
“填充”:“0”,
“borderColor”:“000”,
“边框宽度”:“0”,
“边框样式”:“实心”,
“背景色”:“透明”,
“宽度”:“自动”
},
“占位符”:False,
“图像持有人”:[
{
“url”:无,
“说明”:无,
“宽度”:0,
“高度”:140,
“填充”:10,
“alt”:“,
“href”:无,
“文件路径”:无,
“尺寸”:“原始”,
“源”:“磁盘”,
“显示宽度”:213,
“显示高度”:159,
“显示填充”:{
“左”:10,
“前10名”,
"对":五,,
“底部”:10
}
},
{
“url”:无,
“说明”:无,
“宽度”:0,
“高度”:140,
“填充”:10,
“alt”:“,
“href”:无,
“文件路径”:无,
“显示宽度”:213,
“显示高度”:159,
“源”:“磁盘”,
“尺寸”:“原始”,
“显示填充”:{
“左”:5,
“前10名”,
"对":五,,
“底部”:10
}
},
{
“url”:无,
“说明”:无,
“宽度”:0,
“高度”:140,
“填充”:10,
“alt”:“,
“href”:无,
“文件路径”:无,
“显示宽度”:213,
“显示高度”:159,
“源”:“磁盘”,
“尺寸”:“原始”,
“显示填充”:{
“左”:5,
“前10名”,
“对”:10,
“底部”:10
}
}
],
“方向”:“水平”,
“SmartSize”:正确,
“标题”:错误,
“captionDefault”:无,
“类型”:“图像”
}
}
]
}
}
}
如何检查和更新
imageHolder
键的值?递归遍历树结构,以找到您关心的元素。例如:
>>> def process(blob):
... for (k,v) in blob.items():
... if k == 'imageHolder':
... ...do-something...
... if isinstance(v, dict):
... process(v)
如果isinstance(v,dict):行可能会被不同的选项所取代,具体取决于您希望输入的内容——例如,您可以使用类似于
if hasattr(v,'items')的东西来进行duck键入。
您可以使用递归函数将列表和字典值降序:
def get_all(data, key):
sub_iter = []
if isinstance(data, dict):
if key in data:
yield data[key]
sub_iter = data.itervalues()
if isinstance(data, list):
sub_iter = data
for x in sub_iter:
for y in get_all(x, key):
yield y
您需要递归:
def search_key(mykey, mydict):
if isinstance(mydict, dict):
for key, value in mydict.items():
search_key(mykey, value)
if mykey in mydict:
print 'found old_value=%r' % mydict[mykey]
mydict[mykey]='foo' # update
elif isinstance(mydict, (list, tuple)):
for value in mydict:
search_key(mykey, value)
search_key('imageHolder', mydict)
mydict={...} # your long json structure
search_key('imageHolder', mydict)