【问题标题】:dictionary to JSON?字典转 JSON?
【发布时间】:2015-04-30 07:50:29
【问题描述】:

我有以下字典:

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,让孩子们在其中拥有孩子们。

【问题讨论】:

  • 首先关心如何将dict转换为另一个dict。 “转换为 JSON”部分是微不足道的,与问题并不真正相关。
  • 您好,您建议将此词典转换为具有不同布局的另一个词典吗?可以直接dump的布局?
  • @Henkes:是的。 json 库生成有效的 JSON 作为 Python 字典、列表和值结构的一对一翻译。您需要先进行转换。
  • 你已经尝试了什么?我清楚地看到你拥有什么,你想得到什么,但我不知道你已经尝试过什么来帮助你做得更好......
  • 编辑了我的问题,孩子们的孩子是我正在努力解决的问题。 (和他们的孩子等)

标签: javascript python json dictionary


【解决方案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"
    }
  ]
}

【讨论】:

  • 感谢递归变换函数正是我所需要的!使用常规的 for 循环它不起作用。
  • @HR123r:一种非常灵活的方法是使用“autovivification”。更一般地,查找与构建称为“Tree”的数据结构相关的内容。它们也可以表示为嵌套序列。
  • 虽然这里只有一个字典,但它包含了整个Tree的节点,这里用id字符串表示——所以它相当于一个字典的字典。这意味着应该可以将一种转换为另一种。因此,我认为,您可以使用最方便的表示来思考和做事(并根据需要将其转换为其他表示)。如果我遇到你想要的好例子或参考,我会告诉你的。
  • 是的——我说错了。这是 dicts 的 dict,但物理嵌套永远不会更深(所以它永远不会成为 dicts of dicts of ...等的 dicts),但从逻辑上讲,它可以代表这一点。
  • @HR123r:不要认为这是一个好主意,因为它与这个问题关系不大。建议您尝试获取此处生成的输出并将其反向转换回原始结构。然后,如果您无法弄清楚,请在此处发布一个单独的问题,描述您想要做什么并展示您的尝试。
猜你喜欢
  • 1970-01-01
  • 2018-07-04
  • 2017-02-22
  • 2014-12-31
  • 1970-01-01
  • 1970-01-01
  • 2011-01-29
  • 1970-01-01
相关资源
最近更新 更多