添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

如何在一个JSON对象中进行循环?

0 人关注

我想在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
01001

我想以后把这些写在一个二维数组中。但这并不重要。只要我能够输出独立于嵌套的值就足够了。

I use Python version 2.7.17

5 个评论
你到底想解决什么问题?
Ali
我想创建一个二维数组,它总是包含以下数据:("key", "parent", "val")。
你说的 "父母 "是什么意思?
json_obj 不是一个 "JSON对象"。它是一个 dict 。一旦 json.loads 返回,JSON就不再有意义了。
python
json
python-2.7
Ali
Ali
发布于 2020-02-10
1 个回答
Laurent LAPORTE
Laurent LAPORTE
发布于 2020-02-10
已采纳
0 人赞同

那么,你可以用 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)

The result:

['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}}'

You get: