2016-09-21 59 views
5

Python'a (ve genel olarak kodlamaya) yeniyim, bu kadar uzağım var ama sorun yaşıyorum. Her çalışanla ilgili bilgileri içeren bir json dosyasını döndüren bir web servisine karşı sorgu yapıyorum. Her çalışan için sadece bir kaç özellik almak istiyorum, ama bir sorun yaşıyorum.JSON'dan yinelenen bir anahtarı nasıl çekerim?

Ben şimdiye kadar bu senaryomuz var:

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'] 

Bu gibi görünüyor döndüren 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", 
}, 

Senaryoyla ben çalışanın adını dönebilmek görebilirsiniz dizin 1'de. print j[**0 through len(j)**]['name'] satırlarında daha fazla bir şey yapmak istiyorum, bu yüzden json listesindeki her çalışanın adını (ve tercihen telefon numarasını) yazdıracağım.

Eminim ki yanlış bir şeye yaklaşıyorum ama biraz geri bildirim ve yönelime ihtiyacım var.

+1

Eğer döngü için veriler üzerinde gidip çalışan bilgi almak için kullanmayı denediniz mi? İpucu, j (0) 'derken, belirttiğiniz gibi, bir" liste "indeksinizi belirtiyorsunuz. Bu nedenle, eğer 'j' üzerinde döngü yaparsanız, her yineleme sizin sözlüğünüz olacak ve verilerinize her bir yinelemeden erişebilirsiniz. – idjaw

+0

Örneğiniz JSON yanlış. '[...] 'içine sarın –

cevap

6

JSON'unuz, dict ürününün list sürümüdür. j[1] yaparak, 1 dizinindeki listede bulunan öğeye erişiyorsunuz. tüm kayıtları almak için, siz listenin tüm unsurları yinelemek gerekiyor: j Yanıtınızda j = json.loads(the_page) sonucu belirtilen gibidir

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

3

daha kitlesel dönüşümler için biraz daha güzel gerektiğinde tek tek arayacağımızı Gerekirse

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 

(böylece her zaman name veyagerek yoktu: tekrarlanan dict arama operator.itemgetter kullanıyor), daha sonra düzenli olarak dict aramaları mantıklı olacaktır, bu sadece her zaman iş parçacığı fonksiyonlarını (ki, CPython referans yorumlayıcısında, C içinde uygulanır, böylece çalıştırırsanız, aynı öğe kümesini aldığınız durumu optimize eder. El-haddelenmiş koddan biraz daha hızlı). Jeneratör tabanlı bir map kullanmak kesinlikle gerekli değildir, ancak sonucu yine de yineleyecek olursanız geçici olarak list s'yi (potansiyel olarak büyük) üretmekten kaçınılır.

O var temelde sadece daha hızlı bir versiyonu:

for emp in j: 
    name, phone_number = emp['name'], emp['phone_number'] 
    print name, phone_number