Erledigt: Zugriff auf JSON Element

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
CoderGirl
User
Beiträge: 74
Registriert: Samstag 22. April 2017, 17:47

Hallo

ich habe eine Frage zum Zugriff auf ein JSON-Element.

Folgendes Beispiel

Code: Alles auswählen

{
    "firstName": "Jane",
    "lastName": "Doe",
    "hobbies": ["running", "sky diving", "singing"],
    "age": 35,
    "children": [
        {
            "firstName": "Alice",
            "age": 6
        },
        {
            "firstName": "Bob",
            "age": 8
        }
    ]
}
Wie greif ich auf das Alter von Bob zu?

Bisher habe ich es immer über ein dict gemacht, aber da waren dann die Keys eindeutig. Danke

Codergirl
Zuletzt geändert von CoderGirl am Mittwoch 15. Juli 2020, 09:16, insgesamt 1-mal geändert.
Nur ein Mädchen, das nie so viel weiss, wie die Jungs :ugeek:
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Das schöne an JSON ist, dass es in der Notation ziemlich identisch zu den Datenstrukturen in Python ist:

Code: Alles auswählen

>>> data = {
    "firstName": "Jane",
    "lastName": "Doe",
    "hobbies": ["running", "sky diving", "singing"],
    "age": 35,
    "children": [
        {
            "firstName": "Alice",
            "age": 6
        },
        {
            "firstName": "Bob",
            "age": 8
        }
    ]
}
>>> data
{'firstName': 'Jane', 'lastName': 'Doe', 'hobbies': ['running', 'sky diving', 'singing'], 'age': 35, 'children': [{'firstName': 'Alice', 'age': 6}, {'firstName': 'Bob', 'age': 8}]}
>>> data["children"]
[{'firstName': 'Alice', 'age': 6}, {'firstName': 'Bob', 'age': 8}]
>>> data["children"][1]
{'firstName': 'Bob', 'age': 8}
Das ist also eine Verschachtelung von Listen und Wörterbüchern.
Wenn du gezielt nach "Bob" suchst, müsstest du die Elemente in "children" durchgehen und dir die Namen anschauen, ob der passende dabei ist.
Benutzeravatar
CoderGirl
User
Beiträge: 74
Registriert: Samstag 22. April 2017, 17:47

Ich habe den Zugriff hinbekommen . Ich kann analog eines Dict auf ["children"][1]["age"] zugreifen :)
Nur ein Mädchen, das nie so viel weiss, wie die Jungs :ugeek:
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@CoderGirl: Wobei Du damit auf das Alter des zweiten Kinds zugreifst, ob das nun Bob heisst oder nicht. Falls das mit dem Namen wichtig ist, siehe sparrow's Antwort.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
snafu
User
Beiträge: 6867
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Zur Veranschaulichung:

Code: Alles auswählen

for child in data["children"]:
    if child["firstName"] == "Bob":
        print(child)
Benutzeravatar
CoderGirl
User
Beiträge: 74
Registriert: Samstag 22. April 2017, 17:47

Danke euch, aber aktuell ist das JSO quasi-statisch und da geht es auch per INDEX.
Ansonsten muss ich durchgehen, das ist klar :)
Nur ein Mädchen, das nie so viel weiss, wie die Jungs :ugeek:
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Falsche Einstellung. Aktuell scheint das so zu funktionieren, später wenn sich daran etwas ändert, merkst Du das gar nicht und Du bekommst falsche Ergebnisse.
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Code: Alles auswählen

#!/usr/bin/env python3
from glom import Check, glom, Iter, SKIP


def main():
    data = {
        "firstName": "Jane",
        "lastName": "Doe",
        "hobbies": ["running", "sky diving", "singing"],
        "age": 35,
        "children": [
            {"firstName": "Alice", "age": 6},
            {"firstName": "Bob", "age": 8},
        ],
    }
    bobs_age = glom(
        data,
        (
            "children",
            Iter().first(Check("firstName", equal_to="Bob", default=SKIP)),
            "age",
        ),
    )
    print(bobs_age)


if __name__ == "__main__":
    main()
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten