2017-11-07 2 views
0

ich mit einer Eisenbahn-API bin arbeiten, die JSON-Daten zu jedem Zug gibt, wie die Richtung, Geschwindigkeit, Position, das Ziel, usw.Python gibt nur JSON Schlüssel, aber nicht Werte

Ich schreibe ein einfache Funktion, die nur die Züge zurückgibt, die in die von mir angegebene Richtung fahren. Ich versuche das in einer for-Schleife zu machen.

def getAllTrainsMatchingCriteria(line, direction): 
    url = 'http://api.example.com/developer/api/v2/vehiclesbyroute?api_key=key&route='+line+'&format=json' 
    try: 
     response = (requests.get(url)).json() 
    except: 
     print('Unable to connect to API endpoint.') 

    # Parse Data 
    for trip in response['direction']: 
     if trip['direction_name'] == direction: 
      trains = [] 
      for train in trip['trip']: 
       trains += train 
      return trains 

Hier ist ein Beispiel für die Daten, die ich mit arbeiten: als ich

in meiner for-Schleife
{ 
    "route_id": "Route", 
    "route_name": "Route", 
    "route_type": "2", 
    "mode_name": "Commuter Rail", 
    "direction": [ 
     { 
     "direction_id": "0", 
     "direction_name": "Outbound", 
     "trip": [ 
      { 
       "trip_id": "Train-800-Weekday", 
       "trip_name": "8:00 Train from City", 
       "trip_headsign": "Destination", 
       "vehicle": { 
        "vehicle_id": "1701", 
        "vehicle_lat": "42.0341186523438", 
        "vehicle_lon": "-71.2189483642578", 
        "vehicle_bearing": "216", 
        "vehicle_speed": "0", 
        "vehicle_timestamp": "1510092937", 
        "vehicle_label": "1818" 
       } 
      }, 
      { 
      "another example train" 
      }, 
      { 
      "another train, etc." 
      } 
     ] 
    } 
} 

Wenn ich Zug auf der Konsole zu drucken, ich alle Züge zu sehen, dass meine Kriterien entsprechen erwartet und die Daten sind richtig strukturiert.

Wenn ich Züge nach meiner for-Schleife drucke oder zurückschicke, sehe ich nur eine Reihe von Schlüsseln wie trip_id, trip_name usw. Keine Werte oder andere Daten.

In diesem Beispiel gibt es nur einen Zug, der meinen Kriterien entspricht, aber sagen wir mal 3. Wie kann ich alle drei Züge mit allen intakten Daten zurückgeben?

Antwort

0

return existiert die Methode auf einmal, sollten Sie es nach der for -loop setzen. Als nächstes erweitern Sie die Liste trains mit dem Wörterbuch train, das heißt, alle Schlüssel von train in die Liste angehängt:

def getAllTrainsMatchingCriteria(line, direction): 
    url = 'http://api.example.com/developer/api/v2/vehiclesbyroute?api_key=key&route={}&format=json'.format(line) 
    response = (requests.get(url)).json() 

    # Parse Data 
    trains = [] 
    for trip in response['direction']: 
     if trip['direction_name'] == direction: 
      trains.expand(trip['trip']) 
    return trains 
0

Okay, ein paar Minuten nach der Einlieferung, ich ein anderes ähnliches Beispiel gefunden, wo jemand verwendet .append () anstatt + = um jeden Gegenstand hinzuzufügen. Sicherlich, das hat den Trick gemacht.

for trip in response['direction']: 
    if trip['direction_name'] == direction: 
     trains = [] 
     for train in trip['trip']: 
      trains.append(train) 
     return trains 

Ich denke jetzt sollte ich genau herausfinden warum.

Verwandte Themen