Hướng dẫn python json recursive search - tìm kiếm đệ quy python json

Tôi đang cố gắng lấy các giá trị lồng nhau từ tệp JSON. Tôi muốn in ra từng giá trị cho mỗi khóa "ID". Tôi nghĩ rằng tôi gần gũi nhưng không thể tìm ra lý do tại sao loại OBJ thay đổi từ một danh sách sang danh sách, và sau đó tại sao tôi không thể phân tích danh sách đó. Đây là một liên kết đến JSON mà tôi đang làm việc với: http://hastebin.com/ratevimixa.tex

Và đây là mã hiện tại của tôi:

#!/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)

-------------------------------------------------------------------------------------------updateupdate

Đây là những gì tôi đang làm việc và nó sẽ trả về một giá trị ID duy nhất, nhưng không phải tất cả chúng:

#!/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 (_)

Hướng dẫn python json recursive search - tìm kiếm đệ quy python json

Funnydman

7.3663 Huy hiệu vàng27 Huy hiệu bạc51 Huy hiệu Đồng3 gold badges27 silver badges51 bronze badges

Đã hỏi ngày 9 tháng 1 năm 2014 lúc 19:06Jan 9, 2014 at 19:06

1

JSON có thể chứa một danh sách các đối tượng, cần tìm kiếm:

Phiên bản 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

Phiên bản 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)

Hướng dẫn python json recursive search - tìm kiếm đệ quy python json

Đã trả lời ngày 18 tháng 8 năm 2016 lúc 10:40Aug 18, 2016 at 10:40

Hướng dẫn python json recursive search - tìm kiếm đệ quy python json

Bo Sunesenbo SunesenBo Sunesen

8811 Huy hiệu vàng7 Huy hiệu bạc9 Huy hiệu đồng1 gold badge7 silver badges9 bronze badges

4

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

Điều này sẽ tạo ra một trình lặp sẽ mang lại mọi giá trị ở mọi cấp độ dưới "ID" khóa. Ví dụ sử dụng (in tất cả các giá trị đó):

for _ in id_generator(some_json_dict):
    print(_)

Hướng dẫn python json recursive search - tìm kiếm đệ quy python json

Đã trả lời ngày 9 tháng 1 năm 2014 lúc 19:30Jan 9, 2014 at 19:30

Hướng dẫn python json recursive search - tìm kiếm đệ quy python json

9

Một chút mã sạch hơn (trong 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

Đã trả lời ngày 23 tháng 9 năm 2020 lúc 3:36Sep 23, 2020 at 3:36

Hướng dẫn python json recursive search - tìm kiếm đệ quy python json

1

Dưới đây là một hàm đệ quy đơn giản để thu thập tất cả các giá trị từ tài liệu JSON cho một khóa nhất định. Giá trị có thể là tài liệu JSON là tốt. Các giá trị tương ứng được nối vào search_result.

def json_full_search(lookup_key, json_dict, search_result = []):
    if type(json_dict) == dict:
        for key, value in  json_dict.items():
            if key == lookup_key:
                search_result.append(value)
            json_full_search(lookup_key, value, search_result)
    elif type(json_dict) == list:
        for element in json_dict:
            json_full_search(lookup_key, element, search_result)
    return search_result

Đã trả lời ngày 3 tháng 2 lúc 21:06Feb 3 at 21:06

def get_val(j, s, v=None):
for k in j:
    if v == None and k == s:
        return j[k]
    elif v != None and k == s and v == j[k]:
        return True
    elif v != None and k == s and v != j[k]:
        return False
    elif isinstance(j[k], dict):
        return get_val(j[k], s, v)

Bạn có thể sử dụng cho danh sách JSON bên dưới,

for l in j:
    r = get_val(l, 'key')
    print(r)

#!/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 (_)
0

Đã trả lời ngày 16 tháng 12 năm 2020 lúc 14:34Dec 16, 2020 at 14:34

Hướng dẫn python json recursive search - tìm kiếm đệ quy python json

Tiện ích mở rộng cho Python 3.x Trả lời: Nếu JSON lồng nhau có các khóa tương tự trong danh sách hoặc từ điển khác nhau và bạn muốn lấy giá trị đầu tiên của nó .. Dưới đây là cách chung:

#!/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 (_)
1

Đã trả lời ngày 29 tháng 10 năm 2021 lúc 23:56Oct 29, 2021 at 23:56

Hướng dẫn python json recursive search - tìm kiếm đệ quy python json

Ram Ghadiyaramram GhadiyaramRam Ghadiyaram

33.2K14 Huy hiệu vàng93 Huy hiệu bạc121 Huy hiệu đồng14 gold badges93 silver badges121 bronze badges