迭代json对象中的所有项目

时间:2016-07-15 13:24:16

标签: python json python-3.x python-3.5

通过data = json.load(fp)从文件加载json后,我想迭代json中的所有项目,当然不包括所有特殊的Python符号。 这怎么做得好?

1 个答案:

答案 0 :(得分:11)

此时

data应该是一个普通的集合,因此您可以像迭代任何其他列表/字典/其他任何方式一样迭代它。来自load的事实并不会对您产生任何额外的要求。

这是一个使用loads的示例,原则上类似:

import json
my_json_data = "[1,2,3]"
data = json.loads(my_json_data)
for item in data:
    print(item)

结果:

1
2
3

编辑:如果您要问"如何迭代所有我的数据中的值,包括深层嵌套集合中包含的值?",然后你可以这样做:

import json
my_json_data = """[
    1,
    {
        "2": 3,
        "4": [
            "5",
            "6",
            "7"
        ]
    },
    8,
    9
]"""

def recursive_iter(obj):
    if isinstance(obj, dict):
        for item in obj.values():
            yield from recursive_iter(item)
    elif any(isinstance(obj, t) for t in (list, tuple)):
        for item in obj:
            yield from recursive_iter(item)
    else:
        yield obj

data = json.loads(my_json_data)
for item in recursive_iter(data):
    print(item)

结果:

1
5
6
7
3
8
9

编辑:您还可以跟踪导航到每个值所需的密钥,方法是将它们传递给递归调用,并在传递它们时向集合添加新密钥。

def recursive_iter(obj, keys=()):
    if isinstance(obj, dict):
        for k, v in obj.items():
            yield from recursive_iter(v, keys + (k,))
    elif any(isinstance(obj, t) for t in (list, tuple)):
        for idx, item in enumerate(obj):
            yield from recursive_iter(item, keys + (idx,))
    else:
        yield keys, obj

data = json.loads(my_json_data)
for keys, item in recursive_iter(data):
    print(keys, item)

结果:

(0,) 1
(1, '2') 3
(1, '4', 0) 5
(1, '4', 1) 6
(1, '4', 2) 7
(2,) 8
(3,) 9