如何循环通过JSON对象?

2024-09-30 01:32:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在Python中循环遍历任意JSON对象,并获取所有值。我不知道JSON对象是什么样子的。我只想遍历所有元素。也就是通过子对象和列表。我现在从互联网上获取了一个任意的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

多谢各位


Tags: 对象jsonobj元素列表objectit互联网
1条回答
网友
1楼 · 发布于 2024-09-30 01:32:08

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

相关问题 更多 >

    热门问题