Как л oop через JSON объект? - PullRequest
       3

Как л oop через JSON объект?

0 голосов
/ 09 февраля 2020

Я хочу l oop через произвольный JSON объект в Python и получить все значения. Я не знаю, как выглядит объект JSON. Я просто хочу пройти через все элементы. Так же и через дочерние объекты и списки. Теперь я взял произвольный JSON объект из Inte rnet для проверки. Но это может быть и любой другой объект JSON. В настоящее время я пробую это так:

def printJSONVals(json_object): 
    it = iter(json_object)
    n = json_object[next(it)]
    while n is not None:
        print n
        n = json_object[next(it)]

json_obj = json.loads('{ "city" : "AGAWAM", "loc" : [ -72.622739, 42.070206 ], "pop" : 15338, "state" : "MA", "_id" : "01001"}')

printJSONVals(json_obj)

К сожалению, это не работает, потому что я получаю список "loc" обратно как список, а не отдельные значения. Есть ли способ l oop через JSON объект независимо от глубины вложения и всегда сохранять значение отдельных ключей в переменной n?

В результате я хочу переменная n, чтобы всегда содержать значения ключей. Независимо от глубины вложенности объекта. Поэтому я ожидаю, что этот вывод здесь:

AGAWAM
-72.622739
42.070206
15338
MA
01001

Я хотел бы записать их позже в двумерном массиве. Но это не важно. Достаточно, если мне удастся вывести значения независимо от вложенности.

Я использую Python версия 2.7.17

Спасибо

1 Ответ

1 голос
/ 09 февраля 2020

Ну, вы можете использовать dict ключи для вычисления пути предков.

import json


def print_json(obj, parent=None):
    if isinstance(obj, list):
        for child in obj:
            for path, item in print_json(child, parent):
                yield path, item
    elif isinstance(obj, dict):
        for key, child in obj.iteritems():  # items() in Python3
            child_path = [key] if parent is None else parent + [key]
            for path, item in print_json(child, child_path):
                yield path, item
    else:
        yield parent, obj

С вашим примером, у вас есть:

json_obj = json.loads(
    '{ "city" : "AGAWAM", "loc" : [ -72.622739, 42.070206 ], "pop" : 15338, "state" : "MA", "_id" : "01001"}'
)

for path, item in print_json(json_obj):
    print(path, ":", item)

Результат:

['city'] : AGAWAM
['loc'] : -72.622739
['loc'] : 42.070206
['pop'] : 15338
['state'] : MA
['_id'] : 01001

Другой пример:

json_obj = json.loads(
    '{ "city" : "AGAWAM", "loc" : { "type": "int", "value": 16}}'
)

Вы получаете:

['city'] : AGAWAM
['loc', 'type'] : int
['loc', 'value'] : 16
...