2013-01-09 52 views
7

從以下json中,在python中,我想提取值「TEXT」。除了未知之外,所有的鍵都是不變的。未知可能是任何字符串,如「a6784t66」或「hobvp * nfe」。 未知的值是未知的,只是它會在每個json響應中的那個位置。在Python中嵌入json字典中查找值

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

一行JSON

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

你將如何獲得 「文本」 的價值? (我知道如何加載json與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],然後訪問Info鍵以獲得值TEXT

unknown變化的情況下,你會與代表「已知」的名字也將在你的代碼點的變量替換:

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

如果我有實際閱讀您的正確的問題在第一時間,如果你不知道什麼是unknown在任何時候,你可以做這樣的事情:

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

哪裏values()是包含一個變量:

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

可以用[0]訪問的單個項目列表,然後您可以按上述方式繼續。請注意,這取決於該字典中只存在一個項目 - 如果還有更多項目,則需要稍微調整一下。

+0

我不知道未知的值會是什麼......所以這是行不通的。未知可能是任何字符串。 – user1959942

+0

所以你只需要訪問任何在這一點上,無論名字是啊? – RocketDonkey

+0

是的,這就是爲什麼它叫做unknown = P,否則很容易得到。 – 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

我現在意識到RocketDonkey在他的文章後面提到了這一點!:) – minocha

+0

哈哈,很好+1爲正確的點! – RocketDonkey

+0

@RocketDonkey - 事實上,這就是新用戶的需求! :d – 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)