KeyError beim Einlesen von json-Daten in python

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
SuperM
User
Beiträge: 1
Registriert: Freitag 28. November 2025, 08:48

Hallo zusammen,

ich bin neu hier und hoffe, dass mir jemand helfen kann. :)

Ich versuche Werte aus einem json-String herauszuholen.

json Inhalt:

Code: Alles auswählen

{"properties":{"password":{"key":"password","value":"SomePWD"},"enablePassword":{"key":"enablePassword","value":""},"username":{"key":"username","value":"SomeUsername"}}}admin@server:~$ 
python code:

Code: Alles auswählen

credential_py = json.loads(credential.text)

ssh_password = (credential_py['password']['value'])
ssh_username = (credential_py['username']['value'])
Ich erhalten folgenden Fehler:
KeyError: 'password'

Vielen Dank für eure Hilfe! :)
Sirius3
User
Beiträge: 18331
Registriert: Sonntag 21. Oktober 2012, 17:20

Hier mal der Json-String schön formatiert:

Code: Alles auswählen

{
    "properties": {
        "password": {"key": "password", "value": "SomePWD"},
        "enablePassword": {"key": "enablePassword", "value": ""},
        "username": {"key": "username", "value": "SomeUsername"}
    }
}
Dann sieht man, dass man eine zusätzliche Ebene hat, "properties".

Code: Alles auswählen

credential_py = json.loads(credential.text)["properties"]
ssh_password = credential_py["password"]["value"])
ssh_username = credential_py["username"]["value"]
Zusätzlich sollte man demjenigen, der dieses JSON erfunden hat, sagen, dass ein Wörterbuch dazu da ist, einen Schlüssel auf einen Wert abzubilden, da braucht es kein extra Wörterbuch mit den Keys key und value.
Benutzeravatar
__blackjack__
User
Beiträge: 14246
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Hier mal Code zum sinnvollen umstrukturieren der Eingabedaten.

Code: Alles auswählen

data = {
    "properties": {
        "password": {"key": "password", "value": "SomePWD"},
        "enablePassword": {"key": "enablePassword", "value": ""},
        "username": {"key": "username", "value": "SomeUsername"},
    }
}
# Ziel:
# {"password": "SomePWD", "enablePassword": "", "username": "SomeUsername"}
Mit Syntax:

Code: Alles auswählen

restructured = {
    property_["key"]: property_["value"]
    for property_ in data["properties"].values()
}
Mit `operator.itemgetter()`:

Code: Alles auswählen

from operator import itemgetter

restructured = dict(
    map(itemgetter("key", "value"), data["properties"].values())
)
Mit Kanonen auf Spatzen, äh, mit `glom()`:

Code: Alles auswählen

from glom import glom, Merge, Spec

restructured = glom(data, ("properties.*", [{Spec("key"): "value"}], Merge()))
Wobei man damit auch schön per ”Pfad” auf die beiden Werte im Originalzustand zugreifen kann:

Code: Alles auswählen

ssh_username = glom(data, "properties.username.value")
ssh_password = glom(data, "properties.password.value")
Oder man benutzt ``match``/``case``:

Code: Alles auswählen

match data:
    case {
        "properties": {
            "username": {"value": str() as ssh_username},
            "password": {"value": str() as ssh_password},
        }
    }:
        do_something_with(ssh_username, ssh_password)

    case _:
        raise ValueError("...")
“All tribal myths are true, for a given value of 'true'.” — Terry Pratchett, The Last Continent
Antworten