2013-02-14 6 views
10

でネストすることができ、キーのためのJSONファイル内の値を置き換えます。新しいで、V:私は「DOWNLOAD_URL」Kを置き換えるのpythonのビットを書いた は、私はこのようになりますJSONを持つn個のレベル

{ 
"ROLE_NAME": { 
    "FOO": { 
     "download_url": "http: //something.staging/12345/buzz.zip" 
    }, 
    "BAR": { 
     "download_url": "http: //something.staging/12345/fizz.zip" 
    }, 
    "download_url": "http: //something.staging/12345/fizzbuzz.zip", 
    "db_name": "somedb", 
    "db_server": "dbserver.staging.dmz", 
    "plugin": { 
     "server_url": "http: //lab.staging.corp/server/" 
    } 
} 
} 

値(つまり、新しいdownload_url)。残念ながら、そのjsonスニペット内の3つのdownload_urlsのうちの1つを置き換えます。私は理由を理解していますが、解決策を得るのが少し難しいので、私はここで助けを求めています。

全体JSONオブジェクトは、「データ」 は、だから私はこのような何かをしている:

DOWNLOAD_URLは私が行うために必要なもの、その変数 に割り当てた新しい値が
data["ROLE_NAME"]["download_url"] = download_url 

と呼ばれる任意のキーのためであります["download_url"]その後、私が行くレイヤーで指定したものではなく、それを更新します。

助けるために私のコードの一部:

私は、以前の私のコードで取得したいくつかの値を取り、レスポンスを返すURLを構築します。私はDOWNLOAD_URLの値を構築するために使用される応答から値を抽出

buildinfo_url = "http://something.staging/guestAuth/app/rest/builds/?locator=buildType:%s,tags:%s,branch:branched:any" % (
    bt_number, 
    list_json_load[role_name][0]['tag'] 
) 

送信HTTPリクエスト

client = httplib2.Http() 
response, xml = client.request(buildinfo_url) 

応答XMLからいくつかの値を抽出し、変数

doc = ElementTree.fromstring(xml) 
for id in doc.findall('build'): 
    build_id = "%s" % (id.attrib['id']) 
try: 
    download_url = "http://something.staging/guestAuth/repository/download/%s/%s:id/%s" % (
     bt_number, 
     build_id, 
     build_artifact_zip 
    ) 
    data[role_name]["download_url"] = download_url 
except NameError: 
    print "something" 
DOWNLOAD_URL設定

再帰的に検索して更新する必要があると思います。

+1

我々は何が起こっているかを見ることができるようにあなたのコードを含めるために、質問を編集してください。 :) – Talvalin

+1

これはこれでしたか?http://stackoverflow.com/questions/14048948/how-can-i-use-python-finding-particular-json-value-by-key? –

+0

はい、私はちょうどそれを再度見つけようとしていましたhttp://stackoverflow.com/questions/14048948/how-can-i-use-python-finding-particular-json-value-by-key - 私はこれができると思います私を助けるために使用される – RussellJSmith

答えて

14

recursiの使用

import json 
json_txt = """ 
{ 
"ROLE_NAME": { 
    "FOO": { 
     "download_url": "http: //something.staging/12345/buzz.zip" 
    }, 
    "BAR": { 
     "download_url": "http: //something.staging/12345/fizz.zip" 
    }, 
    "download_url": "http: //something.staging/12345/fizzbuzz.zip", 
    "db_name": "somedb", 
    "db_server": "dbserver.staging.dmz", 
    "plugin": { 
     "server_url": "http: //lab.staging.corp/server/" 
    } 
} 
} 
""" 
data = json.loads(json_txt) 

def fixup(adict, k, v): 
    for key in adict.keys(): 
     if key == k: 
      adict[key] = v 
     elif type(adict[key]) is dict: 
      fixup(adict[key], k, v) 

import pprint 
pprint.pprint(data) 

fixup(data, 'download_url', 'XXX') 

pprint.pprint(data) 

に出力:

{u'ROLE_NAME': {u'BAR': {u'download_url': u'http: //something.staging/12345/fizz.zip'}, 
       u'FOO': {u'download_url': u'http: //something.staging/12345/buzz.zip'}, 
       u'db_name': u'somedb', 
       u'db_server': u'dbserver.staging.dmz', 
       u'download_url': u'http: //something.staging/12345/fizzbuzz.zip', 
       u'plugin': {u'server_url': u'http: //lab.staging.corp/server/'}}} 
{u'ROLE_NAME': {u'BAR': {u'download_url': 'XXX'}, 
       u'FOO': {u'download_url': 'XXX'}, 
       u'db_name': u'somedb', 
       u'db_server': u'dbserver.staging.dmz', 
       u'download_url': 'XXX', 
       u'plugin': {u'server_url': u'http: //lab.staging.corp/server/'}}} 
+0

私は今それをテストしており、すぐに答えを受け入れるように更新されます - 私は助けと迅速な返信のためにupvote!私はあなたを愛しています。{smile} – RussellJSmith

+0

私はあなたの反応を利用して希望の効果を得ることができたと言い返しました。ありがとう@sotapme – RussellJSmith

+0

それがうまくいけばうれしいです - 再帰は危険ですが、あなたがあなたのデータをよく知っていればそれはOKであるはずです。もしあなたが幸せなら他の人が知っているように答えを受け入れてください。 – sotapme

関連する問題