2015-04-30 4 views
0

У меня есть следующий словарь:словарь для JSON?

terms = {"Taste Term":{'children': ['Receptor', 'Descriptor', 'Modulator', 'Tissue'], 'parent': []},"Receptor":{'children': ['ion channel'], 'parent': ['Taste Term']}, "Descriptor":{'children': [], 'parent': ['Taste Term']}, "Modulator":{'children': [], 'parent': ['Taste Term']},"Tissue":{'children': [], 'parent': ['Taste Term']}} 

когда я свалка этот словарь с print json.dumps(terms, indent=4) я получаю следующий JSon файл:

{ 
"Descriptor": { 
    "children": [], 
    "parent": [ 
     "Taste Term" 
    ] 
}, 
"Tissue": { 
    "children": [], 
    "parent": [ 
     "Taste Term" 
    ] 
}, 
"Receptor": { 
    "children": [ 
     "ion channel" 
    ], 
    "parent": [ 
     "Taste Term" 
    ] 
}, 
"Modulator": { 
    "children": [], 
    "parent": [ 
     "Taste Term" 
    ] 
}, 
"Taste Term": { 
    "children": [ 
     "Receptor", 
     "Descriptor", 
     "Modulator", 
     "Tissue" 
    ], 
    "parent": [] 
} 
} 

файл JSON я хочу выглядеть следующим образом:

{ 
"name":"Taste Term", 
"children": [ 
{ 
    "name":"Receptor", 
    "children": [ 

    {"name":"ion channel"} 
    ] 
    }, 
    {"name":"Descriptor"}, 
    {"name":"Modulator"}, 
    {"name":"Tissue"} 
] 
} 

Теперь, как я могу изменить свой словарь, чтобы получить правильную структуру для Json для вывода нижнего Json файл? Поэтому мне нужно отредактировать словарь terms таким образом, чтобы у детей были дети.

+5

Первое беспокойство о том, как превратить Dict в другой Dict. «Преобразование в JSON» часть тривиально и не имеет отношения к проблеме. – abarnert

+0

Привет, вы рекомендуете преобразовать этот словарь в другой словарь с другим макетом? Макет, который можно напрямую сбрасывать? – Henkes

+1

@ Хенкес: да. Библиотека 'json' производит действительный JSON как перевод на один-на-один перевод словаря Python, списка и структуры значений. Сначала вам нужно сделать преобразование. –

ответ

1

Часто самый простой способ справиться с рекурсивными структурами данных - это использовать рекурсивную функцию. В этом случае можно написать тот, который преобразует «узлы» в плоский словарь, который у вас есть, в необходимый для вложенной структуры словаря. Как только это будет сделано, вы можете получить json.dumps() результат, чтобы получить его в формате JSON.

В приведенном ниже коде я скорректировал синтаксис начального словаря terms, предоставленного в вашем вопросе, и переформатировал его, чтобы четко показать его структуру.

import json 

terms = { 
    'root':  {'p': [],   'c': ['branch1', 'branch2', 'branch3']}, 
    'branch1': {'p': ['root'], 'c': ['branch1.1']}, 
    'branch2': {'p': ['root'], 'c': []}, 
    'branch3': {'p': ['root'], 'c': []}, 
    'branch1.1': {'p': ['branch1'], 'c': []} 
} 

def transform(d, parent): 
    return (
     {'name': parent} 
      if not d[parent]['c'] else 
     {'name': parent, 
     'children': [transform(d, child) for child in d[parent]['c']]} 
    ) 

print(json.dumps(transform(terms, 'root'), indent=2)) 

Выход:

{ 
    "name": "root", 
    "children": [ 
    { 
     "name": "branch1", 
     "children": [ 
     { 
      "name": "branch1.1" 
     } 
     ] 
    }, 
    { 
     "name": "branch2" 
    }, 
    { 
     "name": "branch3" 
    } 
    ] 
} 
+0

Спасибо, что функция рекурсивного преобразования именно то, что мне нужно! С регулярными циклами это не сработало. – Henkes

+0

Это можно сделать без рекурсии, однако для этого требуется вспомогательная структура данных, такая как стек или очередь для отслеживания вещей, поэтому часто сложнее. Рекурсия эффективно заменяет собой собственный стек вызовов функции. – martineau

+0

мой вопрос в том, как начать работу с термином словарь для начала? Любая ссылка на соответствующий API или другие ресурсы будет отличной. благодаря! – HR123r

Смежные вопросы