2013-01-09 7 views
7

Từ json sau, trong python, tôi muốn trích xuất giá trị "TEXT". Tất cả các phím đều không đổi ngoại trừ không xác định. Không xác định có thể là bất kỳ chuỗi nào như "a6784t66" hoặc "hobvp * nfe". Giá trị chưa xác định không được biết, chỉ có giá trị đó ở vị trí đó trong mỗi câu trả lời json.Tìm giá trị trong từ điển json lồng nhau trong python

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

một dòng json

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

Làm thế nào bạn sẽ nhận được giá trị của "Văn bản"? (Tôi biết làm thế nào để tải các json với json.loads) .. nhưng tôi không chắc chắn làm thế nào để có được giá trị của "Văn bản". Cảm ơn.

(Tôi không chắc chắn những gì tiêu đề tốt nhất là.)

Trả lời

15

Nó là một chút lenghty, nhưng trong ví dụ mà trên:

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' 

Bạn về cơ bản đối xử với nó như một cuốn từ điển, đi qua các để nhận các giá trị của mỗi từ điển lồng nhau. Phần khác duy nhất là khi bạn nhấn maindata, trong đó giá trị kết quả là một danh sách. Để xử lý điều đó, chúng tôi kéo phần tử đầu tiên [0] và sau đó truy cập vào khóa Info để nhận giá trị TEXT.

Trong trường hợp của unknown thay đổi, bạn sẽ thay thế nó bằng một biến đại diện cho tên 'nổi tiếng' nó sẽ mất ít thời điểm đó trong mã của bạn:

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

Và nếu tôi có thực sự đọc của bạn câu hỏi đúng là lần đầu tiên, nếu bạn không biết unknown là những gì bất cứ lúc nào, bạn có thể làm một cái gì đó như thế này:

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

đâu values() là một biến chứa:

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

Danh sách một mục có thể truy cập được bằng [0] và sau đó bạn có thể tiếp tục như trên. Lưu ý rằng điều này phụ thuộc vào chỉ có một mục có trong từ điển đó - bạn sẽ cần phải điều chỉnh một chút nếu có nhiều hơn.

+0

Tôi không biết giá trị của không xác định sẽ là ... để không hoạt động. Không xác định có thể là bất kỳ chuỗi nào. – user1959942

+0

Vì vậy, bạn chỉ cần truy cập vào bất cứ điều gì là vào thời điểm đó, bất kể tên yeah? – RocketDonkey

+0

Vâng đó là lý do tại sao nó được gọi là không rõ = P, nếu không nó sẽ được dễ dàng để có được. – user1959942

2

Như bạn nói rằng chưa biết là ở một nơi cố định Bạn có thể làm

sau
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 

này nên thực hiện công việc, vì chỉ có chìa khóa chưa biết thực sự 'vô danh'

+0

tôi nhận ra rằng RocketDonkey đã đề cập đến điều này sau trong bài đăng của anh ấy!:) – minocha

+0

Haha, cũng +1 để đi đúng hướng! – RocketDonkey

+0

@RocketDonkey - thực sự thats những gì một người dùng mới cần! : D – minocha

2

Bạn có thể sử dụng một hàm đệ quy để khai thác qua mỗi lớp và in giá trị của nó bằng một thụt lề

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)