python JSON pobiera klucze tylko na pierwszym poziomie

81

Mam bardzo długi i skomplikowany obiekt json, ale chcę uzyskać tylko elementy / klucze na pierwszym poziomie!

Przykład:

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

Chcę otrzymać wynik 1,3,8 !

Znalazłem ten kod:

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

Ale wypisuje wszystkie klucze (także 12 i 25 )

TeNNoX
źródło
5
Nie, to nieprawda. Wyświetla klucze i wartości, które same zawierają podkatalogi. Jeśli chcesz tylko wydrukować klucze, nie drukuj wartości.
Daniel Roseman,
1
Ale nie chcę kluczy podsłównika ... Wiem, że mógłbym pominąć „, wartość”, to było tylko w celu debugowania
TeNNoX

Odpowiedzi:

133

Po prostu zrób proste .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
>>>

Jeśli potrzebujesz posortowanej listy:

keylist = dct.keys()
keylist.sort()
karthikr
źródło
@karthikr, jak uzyskać wynik jako 1, 3, 8.12, 8.25. Zasadniczo chcę, aby dane wyjściowe miały klucze nadrzędne i podrzędne oddzielone jakimś ogranicznikiem
JKC
21
for key in data.keys():
    print key
Frambot
źródło
3

Jak wspomniał Karthik, dct.keys()będzie działać, ale zwróci wszystkie klucze w dict_keystypie, a nie w listtypie. Więc jeśli chcesz wszystkie klucze na liście, to list(dct.keys())zadziała.

Praveen Manupati
źródło
1

Dobrym sposobem sprawdzenia, czy obiekt Pythona jest instancją typu, jest użycie isinstance()funkcji „wbudowanej” Pythona. W przypadku Pythona 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
Hafizur Rahman
źródło