2015-04-30 59 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

有关如何将字典转换成另一个字典第一顾虑。 “转换为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

感谢递归转换函数正是我所需要的!定期for循环它不起作用。 – Henkes

+0

可以在不递归的情况下做到这一点,但这样做需要像堆栈或队列这样的辅助数据结构来跟踪事物,因此通常会更复杂。递归有效地用程序自己的函数调用栈来取代。 – martineau

+0

我的问题是如何去建立术语词典开始?任何与相关API或其他资源的链接都会很好。谢谢! – HR123r