2013-02-14 20 views
10

tarafından iç içe olabilir anahtar için JSON dosyasındaki değeri değiştirin: Yeni ile v: Ben bir "DOWNLOAD_URL" k değiştirir pitonun biraz yazdığı Şöyle JSON sahip n düzeylerinin

{ 
"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/" 
    } 
} 
} 

değer (yani yeni download_url). Maalesef bu json snippet'inde sadece üç download_urls'den birini değiştirir. Neden olduğunu anlıyorum, ama çözümü almakta biraz zorlanıyorum ve bu yüzden burada yardım istiyorum.

tüm json nesnesi "veri" Yani böyle bir şey yapmak geçerli:

DOWNLOAD_URL Yapmam gereken şey değişkene atadığınız yeni değerdir
data["ROLE_NAME"]["download_url"] = download_url 

denilen herhangi bir anahtarının olduğunu ["download_url"] daha sonra gideceğim katmanda belirttiğim yerine onu günceller. Benim kodunda daha önce elde edilen bazı değerler alan

ve bir yanıt döndüren bir url oluşturmak:

benim kod bazıları yardımcı olmak. Ben DOWNLOAD_URL değerini oluşturmak için kullanılacak yanıtından bir değer elde

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'] 
) 

Gönder HTTP isteği

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

tepki xml bazı değer Özü ve değişken

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 set

Yinelemeli olarak arama ve güncelleme yapmalıyım

+1

biz ne olup bittiğini görebilirsiniz böylece kod eklemek için soruyu düzenleyin. :) – Talvalin

+1

Bu bir miydi: http://stackoverflow.com/questions/14048948/how-can-i-use-python-finding-particular-json-value-by-key? –

+0

Evet, sadece tekrar bulmaya çalışıyordum http://stackoverflow.com/questions/14048948/how-can-i-use-python-finding-particular-json-value-by-key - Sanırım bu bana yardımcı olmak için kullanılabilir – RussellJSmith

cevap

14

Recursi kullanarak

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) 

Üretim Üzerindeki:

{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

Ben şimdi test ve cevap kabul etmek için yakında güncellenir - Ben yardım ve hızlı cevap için tavsiye! Soyu seviyorum {smile} – RussellJSmith

+0

İstediğiniz etkiyi almak için cevabınızı kullanabileceğimi söylemek için geri döndüm. Teşekkür @ @sotapme – RussellJSmith

+0

İşe yaradığını duyduğuma sevindim - özyineleme tehlikeli olabilir, ancak verilerinizi iyi biliyorsanız, sorun olmaz. Başkalarının bildiği kadar memnun iseniz cevabı kabul edin. – sotapme

İlgili konular