2013-01-09 13 views
7

Aşağıdaki jsondan python'da "TEXT" değerini çıkarmak istiyorum. Tüm anahtarlar bilinmeyen dışında sabittir. Bilinmeyen "a6784t66" veya "hobvp * nfe" gibi herhangi bir dize olabilir. Bilinmeyen değeri bilinmiyor, her json cevabında yalnızca o konumda olacak.Python'da iç içe json sözlüğünde bir değer bulun

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

bir satır json

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

nasıl "Metin" değerini alır? (Json'u json.loads ile nasıl yükleyeceğimi biliyorum) .. ama "Metin" değerini nasıl alacağımı bilmiyorum. Teşekkürler.

(Ben en iyi başlık ne olduğundan emin değilim.)

cevap

15

Biraz know-how, ama yukarıda o örnekte:

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' 

Temelde geçen bir sözlük olarak davranın iç içe geçmiş sözlüklerin değerlerini almak için tuşlar. Tek farklı bölüm, sonuç değerinin bir liste olduğu maindata'u tıklamanızdır. Bunu işlemek için [0] ilk elemanını çekip TEXT değerini almak için Info anahtarına erişiriz. unknown değişen durumunda

, bunu kodunuzda bu noktada alacak 'bilinen' adını temsil eden bir değişken ile değiştirin olacaktır:

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

Ve olurdu eğer gerçekten okumak senin values() içeren bir değişkendir

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

: Eğer unknown herhangi bir noktada ne olduğunu bilmiyorsanız soru düzgün ilk kez, böyle bir şey yapabilir

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

[0] ile erişilebilen tek bir öğe listesi ve daha sonra yukarıdaki gibi devam edebilirsiniz. Bunun söz konusu sözlükte yalnızca bir öğe varlığına bağlı olduğunu unutmayın - daha fazla olsaydı bir bit ayarlamanız gerekirdi. Eğer bilinmeyen Sadece bilinmeyen anahtarla beri, işi yapmalıdır aşağıdaki

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 

Bu yapabileceği sabit bir yerde olduğunu söylediği gibi

+0

ile değerini yazdırmak için. Bilinmeyen herhangi bir dize olabilir. – user1959942

+0

Yani, bu noktada ne olursa olsun, adından bağımsız olarak ulaşmanız gerekiyor. – RocketDonkey

+0

Evet, nedeni bilinmiyor = P, bu yüzden almak kolay olurdu. – user1959942

2

+0

Şimdi farkettim ki RocketDonkey bu yazıyı daha sonra dile getirdi!:) – minocha

+0

Haha, doğru noktaya ulaşmak için iyi +1! – RocketDonkey

+0

@RocketDonkey - gerçekten de yeni bir kullanıcının neye ihtiyacı var! : D – minocha

2

kullanabilirsiniz gerçekten 'bilinmeyen' olduğunu bir özyinelemeli fonksiyon her tabakasının içinden kazmak ve ben bu işe yaramaz böylece bilinmeyenin değeri ... ne olacağını bilmiyorum bir girinti

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)