2012-03-28 8 views
1

にキーの値を取得します。より多くの辞書、辞書のリストなどが含まれている可能性があります。別のシステムで作成された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" 
      } 
     } 
     ] 
    } 
    } 
} 

私はどのように調べてimageHolderキーの値を更新するのでしょうか?

答えて

5

あなたはリストと辞書値に下降する再帰関数を使用することができます。

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 
4

は、再帰的にあなたが気に要素を見つけるために、ツリー構造を歩きます。例えば:

>>> def process(blob): 
...  for (k,v) in blob.items(): 
...   if k == 'imageHolder': 
...    ...do-something... 
...   if isinstance(v, dict): 
...    process(v) 

if isinstance(v,dict):ラインは、あなたの入力があることを期待正確に何に応じて様々な選択肢、と置き換えるかもしれないこと - 例えば、あなたはif hasattr(v, 'items')ようなものでダックタイピングを行うことができます。

1

あなたは再帰が必要になります。

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) 
関連する問題