Если вы рассматриваете json как словарь python, это должно сработать.
Я только что написал простую рекурсивную программу.
Сценарий
import json
def js_r(filename):
with open(filename) as f_in:
return(json.load(f_in))
g = js_r("city.json")
answer_d = {}
def base_line(g, answer_d):
for key in g.keys():
answer_d[key] = {}
return answer_d
answer_d = base_line(g, answer_d)
def recurser_func(g, answer_d):
for k in g.keys():
if type(g[k]) == type([]): #If the value is a list
answer_d[k] = {list(g[k][0].keys())[0]:{}}
if type(g[k]) == type({}): #If the value is a dictionary
answer_d[k] = {list(g[k].keys())[0]: {}} #set key equal to
answer_d[k] = recurser_func(g[k], answer_d[k])
return answer_d
recurser_func(g,answer_d)
def printer_func(answer_d, list_to_print, parent):
for k in answer_d.keys():
if len(answer_d[k].keys()) == 1:
list_to_print.append(parent)
list_to_print[-1] += k
list_to_print[-1] += "." + str(list(answer_d[k].keys())[0])
if len(answer_d[k].keys()) == 0:
list_to_print.append(parent)
list_to_print[-1] += k
if len(answer_d[k].keys()) > 1:
printer_func(answer_d[k], list_to_print, k + ".")
return list_to_print
l = printer_func(answer_d, [], "")
final = " ".join(l)
print(final)
Объяснение
base_line
составляет словарь всех ваших базовых ключей.
recursur_func
проверяет, является ли значение ключа списком или диктом, а затем добавляет в словарь ответов по мере необходимости, пока answer_d
не будет выглядеть следующим образом: {'id': {}, 'name': {}, 'salaries': {'salary': {}}, 'states': {'state': {}, 'cities': {'city': {}}}}
После вызова этих двух функций в некотором смысле у вас есть словарь ключей. Затем printer_func - это рекурсивная функция для печати по вашему желанию.
Примечание:
Ваш вопрос похож на этот: Получите все ключи вложенного словаря , но поскольку у вас есть вложенный список / словарь вместо просто вложенного словаря, их ответы не будут работать для вас, но если вам нравится больше информации, то по этому вопросу обсуждается больше вопросов
РЕДАКТИРОВАТЬ 1
моя версия на Python 3.7.1
Я добавил средство открытия файлов json вверху. Я предполагаю, что json называется city.json и находится в том же каталоге
РЕДАКТИРОВАТЬ 2: Более подробное объяснение
Основная трудность, с которой я столкнулся при работе с вашими данными, заключается в том, что вы можете иметь бесконечно вложенные списки и словари. Это усложняет. Поскольку это было бесконечно возможное вложение, я понял, что это проблема рекурсии.
Итак, я создаю словарь словарей, представляющих структуру ключа, которую вы ищете. Сначала я начну с базовой линии.
base_line
делает {'id': {}, 'name': {}, 'salaries': {}, 'states': {}}
Это словарь пустых словарей. Я знаю это, когда ты печатаешь. Каждая ключевая структура (например, states.state
) начинается с одного из этих слов.
рекурсии
Затем я добавляю все дочерние ключи, используя recursur_func
.
Когда задан словарь g
, эта функция для цикла по всем ключам в этом словаре и (при условии, что answer_d
имеет каждый ключ, который есть у g
) для каждого ключа добавит эти ключи-потомки к answer_d.
Если ребенок это словарь. Затем я повторяю с заданным словарем g
, который теперь является частью словаря, который относится к дочерним элементам, а answer_d является частью_ответа answer_d, который относится к дочернему элементу.