2016-09-21 5 views
5

私はPython(そして一般的にはコーディング)を初めて使いました。これまでに得たことがありますが、問題があります。私はすべての従業員に関する情報を持つjsonファイルを返すWebサービスに対して照会しています。私は各従業員のためのいくつかの属性を取得したいですが、私はいくつかの問題を抱えています。JSONから反復キーを取得するにはどうすればよいですか?

私はこれまでのところ、このスクリプトがあります:あなたはスクリプトを使って、私は従業員の名前を返すことができていることがわかります

{ 
    "name": bill jones, 
    "address": "123 something st", 
    "city": "somewhere", 
    "state": "somestate", 
    "zip": "12345", 
    "phone_number": "800-555-1234", 
}, 
{ 
    "name": jane doe, 
    "address": "456 another ave", 
    "city": "metropolis", 
    "state": "ny", 
    "zip": "10001", 
    "phone_number": "555-555-5554", 
}, 

...

import json 
import urllib2 

req = urllib2.Request('http://server.company.com/api') 
response = urllib2.urlopen(req) 
the_page = response.read() 

j = json.loads(the_page) 

print j[1]['name'] 

JSONそれは返すことは、このようになります。しかし、私はprint j[**0 through len(j)**]['name']の行に沿って何かを持っていきたいので、jsonリストにあるすべての従業員の名前(そしてできれば電話番号も)を印刷します。

私はかなり間違っていると確信していますが、フィードバックと方向性が必要です。

+1

はあなたのデータの上に移動して、あなたの従業員情報を取得するために、forループを使用してみましたか?ヒント、あなたが指定した通りに 'j [0]'を実行すると、あなたは 'list'のインデックスを指定しています。したがって、単に 'j'をループすれば、各反復があなたの辞書になり、各反復を通してあなたのデータにアクセスすることができます。 – idjaw

+0

JSONの例が間違っています。それを '[...]'で囲みます –

答えて

6

JSONはlistdictオブジェクトです。 j[1]を実行すると、リストの項目1にアクセスしています。すべてのレコードを取得するためには、として、リストのすべての要素を反復処理する必要があります。jは、あなたの答えにj = json.loads(the_page)の結果言及されているよう

for item in j: 
    print item['name'] 

3

よりも大量の変換のために少しよりよいですdict検索を繰り返しoperator.itemgetterを使用している:

from future_builtins import map # Only on Py2, to get lazy, generator based map 
from operator import itemgetter 

for name, phone_number in map(itemgetter('name', 'phone_number'), j): 
    print name, phone_number 

あなたは、必要に応じて、個々の物事をルックアップするために必要な場合(あなたが常にnameまたはを必要としませんでした)、通常のdictルックアップは意味をなさないでしょう。これは、作業を組み込み関数(CPythonのリファレンスインタプリタではC言語で実装されているため、実行する)にプッシュすることによって常に同じアイテムのセットを取得するケースを最適化します手巻きコードよりも少し早い)。生成元のmapを使用することは厳密には必要ではありませんが、とにかく結果を繰り返し処理するときに一時的に(潜在的に大きな)一時的なものを作成することは避けてください(list)。

それは基本的にただ速いバージョンです:

for emp in j: 
    name, phone_number = emp['name'], emp['phone_number'] 
    print name, phone_number 
関連する問題