2016-09-21 4 views
5

Ich bin neu bei Python (und Codierung im Allgemeinen), ich bin so weit gekommen, aber ich habe Probleme. Ich frage gegen einen Webservice, der eine JSON-Datei mit Informationen über jeden Mitarbeiter zurückgibt. Ich möchte nur ein paar Attribute für jeden Mitarbeiter ziehen, aber ich habe einige Probleme.Wie ziehe ich einen wiederkehrenden Schlüssel aus einem JSON?

Ich habe dieses Skript so weit:

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

Die JSON, dass es wieder so aussieht ...

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

Sie können mit dem Skript sehen, dass ich den Namen des Mitarbeiters zurückkehren in Index 1. Aber ich hätte gerne etwas mehr in der Art von: print j[**0 through len(j)**]['name'], so wird es den Namen (und vorzugsweise auch die Telefonnummer) von jedem Mitarbeiter in der JSON-Liste ausdrucken.

Ich bin mir ziemlich sicher, dass ich etwas falsch angehen, aber ich brauche ein Feedback und eine Richtung.

+1

Haben Sie versucht, mit einer for-Schleife über Ihre Daten zu gehen und Ihre Mitarbeiter Informationen? Tipp: Wenn Sie 'j [0]' wie angegeben ausführen, geben Sie Ihren Index einer 'Liste' an. Wenn Sie also einfach das "j" durchlaufen, ist jede Iteration Ihr Wörterbuch und Sie können auf Ihre Daten bei jeder Iteration zugreifen. – idjaw

+0

Ihr Beispiel JSON ist falsch. Wickeln Sie es in '[...]' –

Antwort

6

Ihre JSON ist die list von dict Objekte. Indem Sie j[1] tun, greifen Sie auf das Element in der Liste unter Index 1 zu. Um alle Datensätze zu erhalten, müssen Sie alle Elemente der Liste als iterieren:

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

wo j ist Ergebnis von j = json.loads(the_page) wie in Ihrer Antwort erwähnt wird

3

etwas schöner für die Massenkonvertierungen als wiederholte dict Lookup verwendet 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 

Wenn Sie einzelne Dinge sehen benötigt je nach Bedarf (so haben Sie nicht immer brauchen name oder phone_number), dann würden reguläre dict Lookups Sinn ergeben, dies optimiert nur den Fall, in dem Sie immer denselben Satz von Elementen abrufen, indem Sie die Arbeit auf eingebaute Funktionen schieben (die auf dem CPython-Referenzinterpreter in C implementiert sind) ein bisschen schneller als handgerollter Code). Die Verwendung eines Generators basierend auf map ist nicht unbedingt notwendig, aber es vermeidet die Herstellung von (möglicherweise großen) temporären list s, wenn Sie das Ergebnis sowieso nur iterieren wollen.

Es ist im Grunde nur eine schnellere Version von:

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