2014-04-26 36 views
23

Tôi đang cố gắng lấy mã zip cho một thành phố cụ thể bằng cách sử dụng zippopotam.us. Tôi có đoạn code sau đây mà làm việc, trừ khi tôi cố gắng truy cập vào phím post code trả về TypeError: expected string or bufferPython Truy cập dữ liệu JSON lồng nhau

r = requests.get('http://api.zippopotam.us/us/ma/belmont') 
j = r.json() 

data = json.loads(j) 

print j['state'] 
print data['places']['latitude'] 

sản lượng Full JSON:

{ 
"country abbreviation": "US", 
"places": [ 
    { 
     "place name": "Belmont", 
     "longitude": "-71.4594", 
     "post code": "02178", 
     "latitude": "42.4464" 
    }, 
    { 
     "place name": "Belmont", 
     "longitude": "-71.2044", 
     "post code": "02478", 
     "latitude": "42.4128" 
    } 
], 
"country": "United States", 
"place name": "Belmont", 
"state": "Massachusetts", 
"state abbreviation": "MA" 
} 

Nhờ sự giúp đỡ của bạn.

Trả lời

13

Tôi không nhận ra rằng phần tử lồng nhau đầu tiên thực sự là một mảng. Cách truy cập đúng vào khóa mã bưu chính như sau:

r = requests.get('http://api.zippopotam.us/us/ma/belmont') 
j = r.json() 

print j['state'] 
print j['places'][1]['post code'] 
35

Địa điểm là danh sách chứ không phải từ điển. Do đó, dòng này dưới đây không hoạt động:

print data['places']['latitude'] 

Bạn cần chọn một trong các mục tại địa điểm và sau đó bạn có thể liệt kê các thuộc tính của địa điểm. Vì vậy, để có được mã bưu điện đầu tiên bạn muốn làm:

print data['places'][0]['post code'] 
5

Trong mã j của bạn là đã dữ liệu json và j [ 'nơi'] là danh sách không dict.

r = requests.get('http://api.zippopotam.us/us/ma/belmont') 
j = r.json() 

print j['state'] 
for each in j['places']: 
    print each['latitude'] 
3

Tôi đang sử dụng lib này để truy cập các phím dict lồng nhau

https://github.com/mewwts/addict

import requests 
from addict import Dict 
r = requests.get('http://api.zippopotam.us/us/ma/belmont') 
ad = Dict(r.json()) 

print j.state 
print j.places[1]['post code'] # only work with keys without '-', space, or starting with number 
Các vấn đề liên quan