Ich rufe viele Webdienste in Python auf, die JSON-formatierten Text zurückgeben, der die gleichen Daten beschreibt, aber alle sind unterschiedlich strukturiert. Anstatt ein Dutzend Möglichkeiten zum Durchlaufen der Daten zu schreiben, versuche ich, einen gemeinsamen Basispfad und einen gemeinsamen Feldnamen zu erstellen, verstehe aber jetzt nicht, um einen dynamischen Namen für das gewünschte Feld zu erstellen.Erstellen eines dynamischen Pfades zum Ergreifen von Variablen aus JSON in Python
service1 die Adresse nennt, "addr1", während service2 es nennt, "address1".
service1 JSON Pfad zu den Addresse: [ "Ergebnisse"] [0] [ "Orte"] [0] [ "addr1"].
service2 JSON-Pfad zur Adresse: ["query"] [0] ["address1"].
service1 Antwort:
{
"results":[
{
"providedLocation":{
"location":"123 Main St. Whoville"
},
"locations":[
{
"addr1":"123 Main St.",
"city":"Whoville"
}
]
}
]
}
Aus meiner häufigsten verwendeten Begriffe translation.ini
[service1]
base_path = '["results"][0]["locations"]'
field = "addr1"
[service2]
base_path = '["query"]'
field = 'address1'
Ich Looping durch die Adressenstellen zurückgegeben, wie diese Datei:
j = json.loads(response.text)
try:
for i in range(0,count_the_results()):
street_number = j[base_path][i][field] # multiple locations returned
except KeyError:
print("street_number error again")
Ich habe versucht mit eval(), aber es lässt die Klammern ([0]), die bricht den Pfad
j[eval(base_path)]
Ich versuchte, die base_path in Stücke brechen, aber eval bringt mich noch
base_path = '["results"][0]'
locations = '["locations"]'
j[eval(str(base_path)+str(locations))]
ich Schlüssel verwenden können, aber immer noch den einzigartigen Weg bauen müssen irgendwie
j.get ("Ergebnisse", {}) [0] .get ("Orte") [i] [field]
Kann jemand bitte darauf hinweisen, was ich bei der Erstellung des Pfades vermisse?
Gibt es einen Grund, warum Sie immer das erste Ergebnis jeder Liste verwenden? Beide Servicemodelle in Ihren Beispielen unterstützen mehrere Adressen. sollten Sie nicht so codieren, dass Sie alle damit umgehen können? – Joe
gute Frage, Joe. Der "base_path" ist der Teil, den ich als statischen Teil der Antwort identifiziert habe - immer 1 Punkt, und zufällig wird er "Ergebnisse" (Plural) genannt. Diesem folgt eine unbekannte Liste von Adressen, die in meinem Beispiel um [i] vor dem gewünschten Feld erhöht wird. Danke für Ihre Antwort. – jim
Sie können immer eine Schritt-für-Schritt-Methode ausführen, bei der Sie die Schlüssel betrachten, wenn es sich um eine bestimmte Zeichenfolge handelt. Auf diese Weise brauchen Sie nur den Namen der Variablen. –