Найти значение в Json с помощью python
Есть файл json с неизвестным количеством тегов. Необходимо доставать значения по определенному тегу, допустим "BD". Сколько тегов уровнями выше или ниже, неизвестно. Возможно ли это сделать? Пока что думаю в сторону рекурсивной функции
В Качестве теста пробовал писать такое:
def myprint(d):
for k, v in d.items():
if isinstance(v, dict):
myprint(v)
print(v)
# else: print("{0} : {1}".format(k,v))
myprint(json_test)
На вид рабочий, но дальше первого ключа k не уходит. Основная проблема в том, что в Json содержатся list, в которых содержатся dict и не получается пройтись именно по list.
{
"A": "1",
"B": [
"C": "2",
"D": "3",
"E": "4",
"F": "5",
"G": "6",
"H": {
"J": "6",
"K": "7"
},
"L": {
"M": "8"
},
"N": {
"O": {
"P": "9",
"R": "10",
"Q": "11",
"S": "12"
}
}
]
}
Ответы (1 шт):
Автор решения: Edward Grachev
→ Ссылка
Обновлено
Мне стало интересно улучшить функцию и я ее переписал
Новый вариант:
import json
def json_pars(*, json_array: json, result_list: list = None, key: str) -> list:
if result_list is None:
result_list = []
if isinstance(json_array, list):
for i in json_array:
json_pars(json_array=i, result_list=result_list, key=key)
if isinstance(json_array, dict):
for i in json_array.keys():
array = json_array[i]
if i == key:
result_list.append(array)
else:
json_pars(json_array=array, result_list=result_list, key=key)
return result_list
with open("test.json", "r", encoding="utf-8") as file:
json_array = json.loads(file.read())
print(json_pars(json_array=json_array, key="TEST"))
Проверял на основе:
[
{
"friends": [
{
"id": 0,
"name": "Christina Blackburn"
},
{
"id": 1,
"name": "Eve Gilmore"
},
{
"id": 2,
"name": "Kelsey Cummings"
}
],
"greeting": "Hello, Lopez Hines! You have 9 unread messages.",
"favoriteFruit": [
"asd",
"asda",
[
"sad",
[
[
{
"TEST": "нашел"
}
]
]
]
]
}
]
Вот пример который будет иметь неограниченное количество вхождений.
Старый вариант кода
import json
a = """
{
"A": "1",
"B": [{
"C": "2",
"D": "3",
"E": "4",
"F": "5",
"G": "6",
"H": {
"J": "6",
"K": "7"
},
"L": {
"M": "8"
},
"N": {
"O": {
"P": "9",
"R": "10",
"Q": "11",
"C": "12"
}
}
},
{
"C": "2",
"D": "3",
"E": "4",
"F": "5",
"G": "6",
"H": {
"J": "6",
"K": "7"
},
"L": {
"M": "8"
},
"N": {
"O": {
"P": "9",
"R": "10",
"Q": "11",
"C": "12"
}
}
}]
}"""
def pars(a: json, result_list: list = None) -> list:
if result_list is None:
result_list = []
for i in a.keys():
if i == "C":
result_list.append(a[i])
elif isinstance(a[i], dict):
pars(a[i], result_list)
elif isinstance(a[i], list):
for j in a[i]:
pars(j, result_list)
return result_list
print(pars(json.loads(a)))