2013-02-14 19 views
10

द्वारा नेस्ट किया जा सकता है कुंजी के लिए JSON फ़ाइल में बदलें मान मैं 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" कश्मीर की जगह लिखा है: एक नया के साथ वी मान (यानी नया download_url)। दुर्भाग्यवश यह उस जेसन स्निपेट में केवल तीन download_urls में से एक को प्रतिस्थापित करता है। मैं समझता हूं क्यों, लेकिन समाधान प्राप्त करने में थोड़ी सी कठिनाई हो रही है, और इसलिए मैं यहां मदद मांग रहा हूं।

पूरे json वस्तु है "डाटा" तो मैं इस तरह कुछ करना:

data["ROLE_NAME"]["download_url"] = download_url 

कहाँ DOWNLOAD_URL एक नया मान रहा है कि चर मैं क्या करने की जरूरत करने के लिए सौंपा गया है कहा जाता है किसी भी कुंजी के लिए है ["download_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) 

प्रतिक्रिया एक्सएमएल से कुछ मूल्य निकालें और DOWNLOAD_URL चर

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" 
सेट

मुझे लगता है कि मुझे रिकर्सली खोज और अद्यतन करना चाहिए

+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

रिकर्सि का उपयोग करना पर

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

मेरी मदद करने के लिए इस्तेमाल किया जा रहा है, मैं अब इसका परीक्षण कर रहा हूं और उत्तर को स्वीकार करने के लिए जल्द ही अपडेट करूँगा - मैं मदद और त्वरित उत्तर के लिए अपवित्र हूं! मुझे SO {smile} – RussellJSmith

+0

पसंद है मैं यह कहने के लिए वापस आया कि मैं वांछित प्रभाव प्राप्त करने के लिए आपकी प्रतिक्रिया का उपयोग करने में सक्षम था। धन्यवाद @sotapme – RussellJSmith

+0

यह सुनकर खुशी हुई - रिकर्सन खतरनाक हो सकता है लेकिन यदि आप अपने डेटा को अच्छी तरह से जानते हैं तो यह ठीक होना चाहिए। अगर आप खुश हैं तो जवाब स्वीकार करें ताकि दूसरों को पता चले। – sotapme

संबंधित मुद्दे