首页 > 解决方案 > 如何遍历 JSON 对象?

问题描述

我想遍历 Python 中的任意 JSON 对象并获取所有值。我不知道 JSON 对象是什么样的。我只想遍历所有元素。所以也通过子对象和列表。我现在从 Internet 上获取了一个任意 JSON 对象进行测试。但它也可以是任何其他 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"作为列表而不是单个值返回。有没有一种方法可以遍历 JSON 对象,而不管嵌套的深度如何,并始终将各个键的值存储在变量中n

因此,我希望变量n始终包含键的值。无论对象嵌套的深度如何。所以我希望这里有这个输出:

AGAWAM
-72.622739
42.070206
15338
MA
01001

我想稍后将它们写在二维数组中。但这并不重要。如果我设法输出独立于嵌套的值就足够了。

我使用 Python 版本 2.7.17

谢谢

标签: pythonjsonpython-2.7

解决方案


好吧,您可以使用 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

推荐阅读