通过嵌套json对python中的特定键进行递归迭代

ada*_*dam 16 python iteration recursion json list-comprehension

我正在尝试从json文件中提取嵌套值.我想打印出每个"id"键的每个值.我认为我很接近,但无法弄清楚为什么obj类型从dict变为列表,然后为什么我无法解析该列表.这是我正在使用的json的链接:http://hastebin.com/ratevimixa.tex

这是我目前的代码:

#!/usr/bin/env python
#-*- coding: utf-8 -*-

import json

json_data = open('JubJubProductions.json', 'r+')
jdata = json.loads(json_data.read().decode("utf-8"))

def recursion(dict):

    for key, value in dict.items():

        if type(value) == type(dict):
            if key != "paging":
                for key, value in value.items():
                    if isinstance (value,list):
                        print key
                        # place where I need to enter list comprehension?
                if type(value) == type(dict):
                    if key == "id":
                        print " id found " + value
                    if key != "id":
                        print key + " 1st level"
                if key == "id":
                    print key
        else:
            if key == "id":
                print "id found " + value       
if __name__ == '__main__':
    recursion(jdata)
Run Code Online (Sandbox Code Playgroud)

-------------------------------------------------- ----------------------------------------- 更新

现在我正在使用它,它将返回一个id值,但不是全部:

#!/usr/bin/env python
#-*- coding: utf-8 -*-

import json

json_data = open('jubjubProductions', 'r+')
jdata = json.loads(json_data.read().decode("utf-8"))

def id_generator(d):
    for k, v in d.items():
        if k == "id":
            yield v
        elif isinstance(v, dict):
            for id_val in id_generator(v):
                yield id_val

if __name__ == '__main__':
    for _ in id_generator(jdata):
        print (_)
Run Code Online (Sandbox Code Playgroud)

Bo *_*sen 21

JSON可能包含需要搜索的对象列表:

Python 2.7版本:

def item_generator(json_input, lookup_key):
    if isinstance(json_input, dict):
        for k, v in json_input.iteritems():
            if k == lookup_key:
                yield v
            else:
                for child_val in item_generator(v, lookup_key):
                    yield child_val
    elif isinstance(json_input, list):
        for item in json_input:
            for item_val in item_generator(item, lookup_key):
                yield item_val
Run Code Online (Sandbox Code Playgroud)

Python 3.x版本:

def item_generator(json_input, lookup_key):
    if isinstance(json_input, dict):
        for k, v in json_input.items():
            if k == lookup_key:
                yield v
            else:
                yield from item_generator(v, lookup_key)
    elif isinstance(json_input, list):
        for item in json_input:
            yield from item_generator(item, lookup_key)
Run Code Online (Sandbox Code Playgroud)

  • 这是正确的答案,因为它也处理列表。您可以使用`yield from` 使它更好一点。 (3认同)

Fil*_*zak 13

def id_generator(dict_var):
      for k, v in dict_var.items():
            if k == "id":
                 yield v
            elif isinstance(v, dict):
                 for id_val in id_generator(v):
                       yield id_val
Run Code Online (Sandbox Code Playgroud)

这将创建一个迭代器,它将在键"id"下的任何级别上产生每个值.用法示例(打印所有这些值):

for _ in id_generator(some_json_dict):
     print(_)
Run Code Online (Sandbox Code Playgroud)

  • 由于对象列表,Bo Sunesen 的答案似乎更合适。 (3认同)

小智 7

更干净的代码(在 python 3.x 中)。

def parse_json_recursively(json_object, target_key):
    if type(json_object) is dict and json_object:
        for key in json_object:
            if key == target_key:
                print("{}: {}".format(target_key, json_object[key]))
            parse_json_recursively(json_object[key], target_key)

    elif type(json_object) is list and json_object:
        for item in json_object:
            parse_json_recursively(item, target_key)


json_object = {"key1": "val1", "key2": [{"key3":"val3", "key4": "val4"}, 123, "abc"]}
target_key = "key3"
parse_json_recursively(json_object, target_key) # Ouput key3: val3

Run Code Online (Sandbox Code Playgroud)