Python 获取深度未知的任意字典中的键值

Python 获取深度未知的任意字典中的键值,python,json,dictionary,Python,Json,Dictionary,我有一本深度和结构未知的词典。它可能包含更多的字典、字典列表等。它是通过反序列化另一个系统创建的一些JSON输入创建的。在字典的不同位置有一个键,可能有多个同名键。我希望获得每个键的值,并理想地更新它们 给定如下目录结构: { "tags":{ "social-1":{ "email":True, "twitter":True, "facebook":True, "linkedin":True, "type":"social

我有一本深度和结构未知的词典。它可能包含更多的字典、字典列表等。它是通过反序列化另一个系统创建的一些JSON输入创建的。在字典的不同位置有一个键,可能有多个同名键。我希望获得每个键的值,并理想地更新它们

给定如下目录结构:

{
  "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)