2013-01-09 11 views
7

में नेस्टेड जेसन शब्दकोश में कोई मान पाएं, निम्नलिखित जेसन से, पायथन में, मैं मान "टेक्स्ट" निकालना चाहता हूं। अज्ञात के अलावा सभी चाबियाँ स्थिर हैं। अज्ञात "a6784t66" या "hobvp * nfe" जैसी कोई स्ट्रिंग हो सकती है। अज्ञात का मान ज्ञात नहीं है, केवल यह कि प्रत्येक जेसन प्रतिक्रिया में उस स्थिति में होगा।पाइथन

{ 
    "A": { 
    "B": { 
     "unknown": { 
     "1": "F", 
     "maindata": [ 
      { 
      "Info": "TEXT" 
      } 
     ] 
     } 
    } 
    } 
} 

एक पंक्ति json

'{"A":{"B":{"unknown":{"1":"F","maindata":[{"Info":"TEXT"}]}}}}' 

कैसे आप "पाठ" का मूल्य प्राप्त होगा? (मुझे पता है कि json.loads के साथ जेसन कैसे लोड करें) .. लेकिन मुझे यकीन नहीं है कि "टेक्स्ट" का मूल्य कैसे प्राप्त करें। धन्यवाद।

(मुझे यकीन है कि क्या सबसे अच्छा शीर्षक है नहीं कर रहा हूँ।)

उत्तर

15

यह थोड़ा lenghty है, लेकिन इसके बाद के संस्करण है कि उदाहरण में:

In [1]: import json 

In [2]: s = """\ 
    ...: { 
    ...: "A": { 
    ...:  "B": { 
    ...:  "unknown": { 
    ...:   "1": "F", 
    ...:   "maindata": [ 
    ...:   { 
    ...:    "Info": "TEXT" 
    ...:   } 
    ...:   ] 
    ...:  } 
    ...:  } 
    ...: } 
    ...: }""" 

In [3]: data = json.loads(s) 

In [4]: data['A']['B']['unknown']['maindata'][0]['Info'] 
Out[4]: u'TEXT' 

आप मूल रूप से एक शब्दकोश के रूप में यह इलाज, गुजर प्रत्येक नेस्टेड शब्दकोश के मूल्य प्राप्त करने के लिए कुंजी। एकमात्र अलग हिस्सा तब होता है जब आप maindata दबाते हैं, जहां परिणामी मान एक सूची होती है। इसे संभालने के लिए, हम पहले तत्व [0] खींचते हैं और फिर TEXT मान प्राप्त करने के लिए Info कुंजी तक पहुंचते हैं।

unknown बदलते के मामले में, आप इसे एक चर है कि 'प्रसिद्ध' नाम यह अपने कोड में उस बिंदु पर ले जाएगा का प्रतिनिधित्व करता है के साथ की जगह लेंगे:

my_variable = 'some_name' 
data['A']['B'][my_variable]['maindata'][0]['Info'] 

और वास्तव में पढ़ अगर मैं होता अपने

data['A']['B'].values()[0]['maindata'][0]['Info'] 

कहाँ values() एक चर युक्त: सवाल ठीक से पहली बार, यदि आप नहीं जानते कि unknown किसी भी बिंदु पर है, तो आप कुछ इस तरह कर सकते हैं

[{u'1': u'F', u'maindata': [{u'Info': u'TEXT'}]}] 

एक एकल आइटम सूची जिसे [0] के साथ उपयोग किया जा सकता है और फिर आप ऊपर के रूप में आगे बढ़ सकते हैं। ध्यान दें कि यह उस डिक्शनरी में केवल एक आइटम मौजूद है - यदि अधिक था तो आपको थोड़ा समायोजित करने की आवश्यकता होगी।

+0

मुझे नहीं पता कि अज्ञात का मूल्य क्या होगा ... ताकि यह काम न करे। अज्ञात कोई स्ट्रिंग हो सकता है। – user1959942

+0

तो हाँ नाम के बावजूद, आपको उस बिंदु पर जो कुछ भी है, उसे एक्सेस करने की आवश्यकता है? – RocketDonkey

+0

हाँ यही कारण है कि इसे अज्ञात = पी कहा जाता है, अन्यथा यह प्राप्त करना आसान होगा। – user1959942

2

जैसा कि आपने कहा है कि अज्ञात एक निश्चित जगह आप निम्न

import json 
s=json.loads('{"A":{"B":{"unknown":{"1":"F","maindata":[{"Info":"TEXT"}]}}}}') 
i=s["A"]["B"].keys() 
x=i[0] # Will store 'unknown' in x, whatever unknown is 
print s['A']['B'][x]['maindata'][0]['Info'] #here x dictionary index is used after B as its value will be the value for unknown 

यह कर काम करना चाहिए कर सकते हैं, केवल अज्ञात कुंजी के बाद से पर था वास्तव में 'अज्ञात'

+0

मुझे अब एहसास हुआ कि रॉकेट डोंकी ने बाद में अपनी पोस्ट में इसका उल्लेख किया है!:) – minocha

+0

हाहा, बिंदु पर सही होने के लिए अच्छी तरह से +1! – RocketDonkey

+0

@RocketDonkey - वास्तव में यह है कि एक नए उपयोगकर्ता की क्या ज़रूरत है! : डी – minocha

2

आप उपयोग कर सकते हैं प्रत्येक परत के माध्यम से खोदने के लिए एक पुनरावर्ती कार्य और उसके मूल्य को इंडेंट

def recurse_keys(df, indent = ' '): 
    ''' 
    import json, requests, pandas 
    r = requests.post(...) 
    rj = r.json() # json decode results query 
    j = json.dumps(rj, sort_keys=True,indent=2)    
    df1 = pandas.read_json(j)   
    ''' 
    for key in df.keys(): 
     print(indent+str(key)) 
     if isinstance(df[key], dict): 
      recurse_keys(df[key], indent+' ') 
recurse_keys(df1)