2014-07-12 16 views
13

Tôi đang học cách sử dụng Python và API (đặc biệt là API World Cup, http://www.kimonolabs.com/worldcup/explorer này)Python và JSON - TypeError danh sách chỉ số phải là số nguyên không str

Các dữ liệu JSON trông như thế này:

[ 
    { 
    "firstName": "Nicolas Alexis Julio", 
    "lastName": "N'Koulou N'Doubena", 
    "nickname": "N. N'Koulou", 
    "assists": 0, 
    "clubId": "5AF524A1-830C-4D75-8C54-2D0BA1F9BE33", 
    "teamId": "DF25ABB8-37EB-4C2A-8B6C-BDA53BF5A74D", 
    "id": "D9AD1E6D-4253-4B88-BB78-0F43E02AF016", 
    "type": "Player" 
    }, 

{ 
    "firstName": "Alexandre Dimitri", 
    "lastName": "Song-Billong", 
    "nickname": "A. Song", 
    "clubId": "35BCEEAF-37D3-4685-83C4-DDCA504E0653", 
    "teamId": "DF25ABB8-37EB-4C2A-8B6C-BDA53BF5A74D", 
    "id": "A84540B7-37B6-416F-8C4D-8EAD55D113D9", 
    "type": "Player" 
    }, 
    ] 

Tôi chỉ đơn giản là cố gắng để in tất cả các firstNames trong API này. Dưới đây là những gì tôi có:

import urllib2 
import json 

url = "http://worldcup.kimonolabs.com/api/players?apikey=xxx" 
json_obj = urllib2.urlopen(url).read 
readable_json = json.dumps(json_obj) 
playerstuff = readable_json['firstName'] 
for i in playerstuff: 
    print i['firstName'] 

Nhưng khi tôi chạy nó, tôi nhận được báo lỗi "... dòng 8, trong ... Lỗi Loại: chỉ số danh sách phải là số nguyên, không str"

Tôi có nhìn xung quanh để tìm giải pháp, nhưng dường như tìm câu hỏi cho nhiều câu hỏi API "sâu hơn" và tôi chưa thực sự hiểu tất cả, vì vậy bất kỳ trợ giúp hoặc giải thích nào về những gì tôi cần làm sẽ thật tuyệt vời. Cảm ơn bạn!

+1

Chỉ cần một số trí tuệ python chung - các yêu cầu thư viện http://docs.python-requests.org/en/latest/ thường là một nhiều thay thế tốt hơn để sử dụng urllib2. –

+0

Tôi sẽ xem xét nó, cảm ơn! – user3718365

+0

Thay vì url tôi không đọc được cái gì như: @ app.route ('/ test', phương thức = ['GET', 'POST']) def foo(): json_obj = request.json readable_json = json. tải (json_obj) cho tôi trong readable_json: in i ['firstName'] nếu tôi làm như vậy, tôi nhận được TypeError: chuỗi dự kiến ​​hoặc bộ đệm –

Trả lời

18

Trước hết, bạn nên sử dụng json.loads, không phải json.dumps. loads chuyển đổi văn bản nguồn JSON thành giá trị Python, trong khi dumps theo cách khác.

Sau khi bạn khắc phục điều đó, dựa trên đoạn mã JSON ở đầu câu hỏi của bạn, readable_json sẽ là một danh sách và do đó readable_json['firstName'] là vô nghĩa. Cách chính xác để lấy trường 'firstName' của mọi thành phần trong danh sách là loại bỏ đường playerstuff = readable_json['firstName'] và thay đổi for i in playerstuff: thành for i in readable_json:.

+0

Aha! Cảm ơn bạn đã giải thích của bạn, đã làm các trick. Bây giờ, để có được tham lam, làm thế nào tôi cũng có thể in 'lastName', bên cạnh tên đầu tiên với một không gian? Và nếu bạn có bất kỳ đề xuất nào về hướng dẫn (bắt đầu đơn giản) của python và API, tôi là tất cả các tai! Cảm ơn sự giúp đỡ của bạn! – user3718365

+0

@ user3718365: 'in i ['firstName'], i ['lastName']' – jwodder

+0

Cảm ơn! Một câu hỏi cuối cùng sẽ khiến tôi trên đường: Nếu tôi muốn liệt kê tất cả các khóa có thể (ví dụ: firstName, lastName, age, v.v.) để người dùng có thể nhập những gì họ muốn xem, làm cách nào tôi trả lại danh sách các phím (là từ đúng)? Ngoài ra, tôi mới sử dụng StackOverflow nên xin lỗi nếu tôi không nên thêm câu hỏi vào câu hỏi. – user3718365

2

Bạn có thể đơn giản hóa mã của bạn xuống

url = "http://worldcup.kimonolabs.com/api/players?apikey=xxx" 
json_obj = urllib2.urlopen(url).read 
player_json_list = json.loads(json_obj) 
for player in readable_json_list: 
    print player['firstName'] 

Bạn đang cố gắng truy cập vào một yếu tố danh sách sử dụng cú pháp điển. tương đương với

foo = [1, 2, 3, 4] 
foo["1"] 

Nó có thể gây nhầm lẫn khi bạn có danh sách các từ điển và giữ làm tổ theo thứ tự.

+0

Cảm ơn điều này, nó giúp. Nhiều đánh giá cao. – user3718365

+0

Sau đó, bạn nên đánh dấu câu trả lời này là được chấp nhận .. –

14

tôi giải quyết thay đổi

readable_json['firstName'] 

bởi

readable_json[0]['firstName'] 
+0

hi = json.dumps (['foo', {'bar': ('baz', None, 1.0, 2)}]) ji = json.loads (hi), ji [0] ["foo"] Traceback (cuộc gọi gần đây nhất): Tệp "", dòng 1, trong LoạiError: chỉ mục chuỗi phải là số nguyên –

Các vấn đề liên quan