Json File mit Python auslesen

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
Antworten
norbert7
User
Beiträge: 5
Registriert: Dienstag 4. Oktober 2022, 22:40

hallo liebes forum,

ich beschäftige mich gerade mit python. unter anderem muss ich auch Json Files
auslesen. was auch ganz gut funktioniert. doch mein vorhaben übersteigt mein wissen.

was ich benötige:

ich möchte gern das alter von hermann angezeigt bekommen,

kann mir jemand helfen
vielen dank




Json file:
----------------

{
"status": "ok",
"data": {
"jahr": 2022,
"land": "deutschland",
"kunden":
[
{
"name": "müller",
"alter": "44",
},
{
"name": "hermann",
"alter": "55",
},
{
"name": "maier",
"alter": "66",
}
]
}
}





Code:
----------------

das_file = json.loads(response.text)

for num in das_file['data']['kunden']:
print("ergebnis:", num['name'])



AUSGABE:
----------------

ergebnis: müller
ergebnis: hermann
ergebnis: maier
Sirius3
User
Beiträge: 18051
Registriert: Sonntag 21. Oktober 2012, 17:20

Variablennamen sind wichtig für das Verständnis. das_file ist ihr was wie Kundendaten. Und wie kommt man darauf Kunden num zu nennen?
Ein response-Objekt hat eine json-Methode.

Code: Alles auswählen

kundendaten = response.json()

for kunde in kundendaten['data']['kunden']:
    print("ergebnis:", kunde['name'])
Das was Du suchst ist die if-Abweisung, mit der Du den Kundennamen mit 'Hermann" vergleichen kannst.
Benutzeravatar
sparrow
User
Beiträge: 4361
Registriert: Freitag 17. April 2009, 10:28

Grundsätzlich solltest du deinen Code immer in Code-Tags setzen damit die Einrückung erhalten bleibt.
Die Code-Tags werden automatisch eingefügt, wenn du den </> Button im vollständigen Editor drückst.

Du hast mit dem json-Modul erfolgreich in Python Datenstrukturen übertragen. Und du weißt offensichtlich, wie man die Namen aus dieser Struktur ausliest. Woran genau scheitert jetzt der Zugriff auf das Alter?

Der Umgang mit Datenstrukturen wie dicts ist in Python essentiell. Die offizielle Dokumentation enthält auch ein recht gutes Tutorial. Das ist ein guter Einstieg um Python zu lernen.
norbert7
User
Beiträge: 5
Registriert: Dienstag 4. Oktober 2022, 22:40

hier die json-file in besserer form.

wie ich mich durch die einzelnen arrays und objekte hangle habe ich herausgefunden,
so erhalte ich alle namen der kunden in der json-file:

Code: Alles auswählen

daten = json.loads(response.text)

for kunde in daten ['data']['kunden']:
    print("ergebnis:", kunde['name'])


ich möchte jedoch gezielt nach einem kunden suchen (welcher mir bekannt ist) und das dazugehörige alter ausgeben
es soll also nur das alter von hermann ausgeben werden.
mit anderen worten: wie alt ist hermann?

das ich das irgedwie vergleichen muss, ist mir bewusst, aber ich weist nicht wie. deshalb hier die frage im forum.


gibt es einen pfiffigen, der mir das lösen kann?
vielen dank!


Code: Alles auswählen

{
    "status": "ok",
    "data": {
        "jahr": 2022,
        "land": "deutschland",
        "kunden":
                        [
                            {
                                "name": "müller",
                                "alter": "44",
                            },
                            {
                                "name": "hermann",
                                "alter": "55",
                            },
                            {
                                "name": "maier",
                                "alter": "66",
                            }
                        ]
            }
}
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wenn du schon durch alles Kunden läufst, fehlt doch nur noch der Vergleich des Namens mit dem gesuchten Namen, und wenn das passt, dann das Alter ausgeben. Und ganz grundsätzlich liefern wir hier keine fertigen Hausaufgaben ab.
norbert7
User
Beiträge: 5
Registriert: Dienstag 4. Oktober 2022, 22:40

ich frage ja nicht umsonst im forum.
ansonsten könnte ich auch 2 bücher lesen. doch leider habe ich diese zeit nicht.

vielleicht findet sich ja hier doch jemand, der mir unkompliziert helfen kann.
danke!
Benutzeravatar
Dennis89
User
Beiträge: 1376
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

du brauchst keine zwei Bücher. Wann willst du das Alter ausgeben? *Wenn* der Name gleich "Hermann" ist.
Übersetze die Antwort mal ins englische und schau nach, welche Zeichen man für eine "ist-gleich" Frage einsetzt.

Du verlierst mehr Zeit, in dem du auf eine fertige Lösung wartest.

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
norbert7
User
Beiträge: 5
Registriert: Dienstag 4. Oktober 2022, 22:40

Code: Alles auswählen


daten = json.loads(response.text)

for kunde in daten ['data']['kunden']:
       gesuchter_name = kunde['name']
	if (gesuchter_name=="hermann"):
	
   


weiter weiß ich nicht,
ich müsste ja jetzt weitersuchen, ohne wieder die komplette "daten" json zu durchlaufen
quasie nur nach dem nächstfolgenden objekt [alter]
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Schleifen kann man abbrechen. Mit break. Oder man packt das ganze in eine Funktion, die man bei gefundenem Namen mit “return alter” verlässt.
Sirius3
User
Beiträge: 18051
Registriert: Sonntag 21. Oktober 2012, 17:20

Du benutzt immer noch loads statt response.json(). Warum?

Du mußt nichts mehr Suchen, denn das "nächstfolgende objekt" [alter] ist im selben Wörterbuch wie der Name, nämlich im Objekt `kunde`. Wenn Du weißt, wie Du an den Namen kommst, dann kennst Du auch das Alter.
norbert7
User
Beiträge: 5
Registriert: Dienstag 4. Oktober 2022, 22:40

habs gelöst,

nach bestätigung ob name hermann ist, einfach als nächstes das alter objekt ausgegeben
die schleife läuft ja einfach weiter....

danke
Benutzeravatar
__blackjack__
User
Beiträge: 13533
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Mal mit Kanonen auf Spatzen geschossen: Mit `glom` erst einmal geprüft ob das was wir da bekommen ein gewisses Format erfüllt, und dann die interessanten Daten extrahiert und passend für einen einfachen Wörterbuchzugriff umgebaut:

Code: Alles auswählen

#!/usr/bin/env python3
import requests
from glom import Iter, Match, Spec, glom, merge


def main():
    # response = requests.get(
    #     "http://www.example.com/example.json", timeout=None
    # )
    # response.raise_for_status()
    # data = response.json()

    data = {
        "status": "ok",
        "data": {
            "jahr": 2022,
            "land": "deutschland",
            "kunden": [
                {"name": "müller", "alter": "44"},
                {"name": "hermann", "alter": "55"},
                {"name": "maier", "alter": "66"},
            ],
        },
    }
    #
    # Daten validieren.
    #
    data = Match(
        {
            "status": "ok",
            "data": {
                "jahr": int,
                "land": str,
                "kunden": [{"name": str, "alter": str}],
            },
        }
    ).verify(data)
    #
    # Interessanten Teil der Daten extrahieren/konvertieren/umstrukturieren.
    #
    name_to_age = glom(
        data,
        (
            "data.kunden",
            Iter({Spec("name"): ("alter", int)}),
            merge,
        ),
    )
    print(name_to_age)
    #
    # Gewünschtes Datum ausgeben.
    #
    print(name_to_age["hermann"])


if __name__ == "__main__":
    main()
Ausgaben:

Code: Alles auswählen

{'müller': 44, 'hermann': 55, 'maier': 66}
55

Code: Alles auswählen

- (void)countSheep {
    unsigned int sheep = 0;
    while ( ! [self isAsleep]) { ++sheep; }
}
Antworten