Python JSON erhält Schlüssel nur in der ersten Ebene


79

Ich habe ein sehr langes und kompliziertes JSON-Objekt, aber ich möchte nur die Gegenstände / Schlüssel in der ersten Ebene erhalten!

Beispiel:

{
    "1": "a", 
    "3": "b", 
    "8": {
        "12": "c", 
        "25": "d"
    }
}

Ich möchte 1,3,8 als Ergebnis erhalten!

Ich habe diesen Code gefunden:

for key, value in data.iteritems():
    print key, value

Es werden jedoch alle Tasten gedruckt (auch 12 und 25 ).


4
Nein, das tut es nicht. Es druckt die Schlüssel und die Werte, die selbst die Unterwörterbücher enthalten. Wenn Sie nur die Schlüssel drucken möchten, drucken Sie den Wert nicht.
Daniel Roseman


1
Aber ich möchte keine Unterwörterbuchschlüssel ... Ich weiß, ich könnte den ", Wert" weglassen, der nur zu Debugging-Zwecken diente
TeNNoX

Antworten:


131

Mach einfach ein einfaches .keys()

>>> dct = {
...     "1": "a", 
...     "3": "b", 
...     "8": {
...         "12": "c", 
...         "25": "d"
...     }
... }
>>> 
>>> dct.keys()
['1', '8', '3']
>>> for key in dct.keys(): print key
...
1
8
3
>>>

Wenn Sie eine sortierte Liste benötigen:

keylist = dct.keys()
keylist.sort()

@karthikr wie man die Ausgabe als 1, 3, 8.12, 8.25 erhält. Grundsätzlich möchte ich, dass die Ausgabe Eltern- und Kinderschlüssel durch ein Trennzeichen getrennt hat
JKC


3

Wie Karthik erwähnt hat, dct.keys()wird es funktionieren, aber es werden alle Schlüssel in dict_keysTyp und nicht in listTyp zurückgegeben. Wenn Sie also alle Schlüssel in einer Liste haben möchten, list(dct.keys())funktioniert dies.


1

Eine gute Möglichkeit, um zu überprüfen, ob ein Python-Objekt eine Instanz eines Typs ist, ist die Verwendung isinstance()der integrierten Python-Funktion. Für Python 3.6:

dct = {
       "1": "a", 
       "3": "b", 
       "8": {
            "12": "c", 
            "25": "d"
           }
      }

for key in dct.keys():
    if isinstance(dct[key], dict)== False:
       print(key, dct[key])
#shows:
# 1 a
# 3 b
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.