2016-09-21 46 views
5

Jestem nowy w Pythonie (i ogólnie w kodowaniu), dotarłem tak daleko, ale mam problem. Pytam w stosunku do usługi internetowej, która zwraca plik json z informacjami o każdym pracowniku. Chciałbym wyciągnąć tylko kilka atrybutów dla każdego pracownika, ale mam problemy.Jak mogę wyciągnąć klucz powtarzalny z JSON?

mam ten skrypt do tej pory:

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, że zwraca ona wygląda tak ...

{ 
    "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", 
}, 

Widać, że ze skryptem mogę wrócić nazwisko pracownika w indeksie 1. Ale chciałbym mieć coś więcej na wzór: print j[**0 through len(j)**]['name'], aby wydrukować nazwisko (a najlepiej także numer telefonu) każdego pracownika na liście JSON.

Jestem prawie pewien, że podchodzę do czegoś złego, ale potrzebuję informacji zwrotnej i wskazówek.

+1

Czy próbowałeś za pomocą pętli for, aby przejść nad swoimi danymi i uzyskać informacje o pracownikach? Podpowiedź, gdy wykonujesz 'j [0]', jak wskazałeś, określasz swój indeks 'listy'. Dlatego jeśli po prostu zapętlisz 'j', każda iteracja będzie twoim słownikiem i będziesz mógł uzyskać dostęp do twoich danych przez każdą iterację. – idjaw

+0

Twój przykład JSON jest błędny. Zawiń go wewnątrz '[...]' –

Odpowiedz

6

Twój JSON jest obiektami list z dict. Wykonując j[1], uzyskujesz dostęp do pozycji na liście o indeksie 1. Aby uzyskać wszystkie rekordy, trzeba wykonać iterację wszystkich elementów na liście jako:

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

gdzie j jest wynikiem j = json.loads(the_page) jak wspomniano w odpowiedzi

3

Nieco milszy dla masowych konwersji niż powtórzony dict odnośnika używa 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 

Jeśli potrzebne do wyszukiwania poszczególnych rzeczy, ile potrzeba (więc nie zawsze trzeba name lub phone_number), wtedy zwykłe wyszukiwania o nazwach dict miałyby sens, to tylko optymalizuje przypadek, w którym zawsze pobierasz ten sam zestaw elementów przez popychanie pracy do wbudowanych funkcji (które, na interpretercie referencji CPython, są zaimplementowane w C, więc działają nieco szybszy niż kod zwijany ręcznie). Używanie generatora opartego na map nie jest bezwzględnie konieczne, ale pozwala uniknąć (potencjalnie dużych) tymczasowych s, gdy po prostu zamierzasz powtórzyć wynik.

Jest to w zasadzie tylko szybsza wersja:

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