2013-01-09 20 views
7

Dal seguente jSON, in python, mi piacerebbe estrarre il valore "TEXT". Tutte le chiavi sono costanti tranne che per sconosciute. Sconosciuto potrebbe essere qualsiasi stringa come "a6784t66" o "hobvp * nfe". Il valore di sconosciuto non è noto, solo che sarà in quella posizione in ogni risposta JSON.Trova un valore nel dizionario json annidato in python

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

una linea JSON

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

Come ti ottenere il valore di "testo"? (So ​​come caricare il json con json.loads) .. ma non sono sicuro di come ottenere il valore di "Text". Grazie.

(io non sono sicuro di quello che il titolo migliore è.)

risposta

15

E 'un po' lenghty, ma in che nell'esempio precedente:

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' 

Che, fondamentalmente, trattarlo come un dizionario, passando per la chiavi per ottenere i valori di ogni dizionario annidato. L'unica parte diversa è quando si colpisce maindata, dove il valore risultante è un elenco. Per gestirlo, tiriamo il primo elemento [0] e quindi accediamo alla chiave Info per ottenere il valore TEXT.

Nel caso di unknown che cambia, si sarebbe sostituirlo con una variabile che rappresenta la 'nota' nome ci vorrà a quel punto nel codice:

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

E se avrei effettivamente letto il tuo domanda correttamente la prima volta, se non si sa che cosa è unknown in qualsiasi momento, si può fare qualcosa di simile:

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

Dove values() è una variabile che contiene:

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

Un elenco di articoli singoli a cui è possibile accedere con [0] e quindi procedere come sopra. Si noti che questo dipende dal fatto che ci sia solo un elemento presente in quel dizionario - sarebbe necessario regolare un po 'se ce ne fossero di più.

+0

Non so quale sarà il valore di unknown ... in modo che non funzioni. Sconosciuto potrebbe essere qualsiasi stringa. – user1959942

+0

Quindi devi solo accedere a qualsiasi cosa sia a quel punto, indipendentemente dal nome sì? – RocketDonkey

+0

Sì, ecco perché è chiamato unknown = P, altrimenti sarebbe facile da ottenere. – user1959942

2

Come lei ha detto che sconosciuto era ad un posto fisso È possibile effettuare le seguenti

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 

Questo dovrebbe fare il lavoro, dal momento che solo la chiave sconosciuta è davvero 'sconosciuto'

+0

ho realizzato ora che RocketDonkey ha menzionato questo più tardi nel suo post!:) – minocha

+0

Haha, beh +1 per arrivare al punto giusto! – RocketDonkey

+0

@RocketDonkey: è proprio quello di cui ha bisogno un nuovo utente! : D – minocha

2

È possibile utilizzare una funzione ricorsiva per scavare attraverso ogni livello e stampare il suo valore con una rientranza

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) 
Problemi correlati