将现有的defaultdict输出为适用于flare dendogram Python的JSON格式

时间:2015-07-13 19:15:07

标签: python html json

我有一个defaultdict(list),我使用simplejson.dums(my_defaultdict)来将defaultdict输出为JSON格式。我正在使用来自http://bl.ocks.org/mbostock/4063570的树形图的HTML代码,但我试图将我的defaultdict信息变成作者正在使用的JSON文件的格式。此JSON文件名为:/mbostock/raw/4063550/flare.JSON,可在此链接中找到:http://bl.ocks.org/mbostock/raw/4063550/flare.json

所以这是我的defaultdict数据:

my_defaultdict = {5: ['child10'], 45: ['child92', 'child45'], 33:['child38']}

json_data = simplejson.dumps(my_defaultdict)

所以我现在的json_data看起来像这样:

{
"5": [
        "child10"
], 
"45": [
    "child92", 
    "child45"
], 
"33": [
    "child38"
]
}

所以在我的理解中,数字将是相应的“名称”:“5”然后我的JSON格式文件也将子项作为“子”。就像现在一样,我的JSON格式输出不会在树形图的HTML代码中运行。

有关如何将我的defaultdict输出到适当的JSON格式的任何帮助都可以使用HTML代码来生成该树形图。代码必须是Python。

预期结果如下:

{
 "name": "flare",
     "children": [
  {
   "name": "5",
   "children": [
    {
     "name": "child10", "size": 5000},
     ]
    {
     "name": "45",
     "children": [
      {"name": "child92", "size": 3501},
      {"name": "child45", "size": 3567},
    ]
    },
     {
 "name": "33",
 "children": [
  {"name": "child38", "size": 8044}
 ]
}
}

编辑: 马蒂诺的答案有效,但这并不是我想要的。我从一个defaultdict(列表)和所需的输出开始,如上所述应该将“children”作为dicts列表,而对于martineau类型的答案,“children”它只是一个列表。如果任何人可以添加一些东西来使它工作,那将是伟大的。不要担心“大小”变量,现在可以忽略它。谢谢。

3 个答案:

答案 0 :(得分:3)

您需要从defaultdict创建一个新字典。示例代码中的子项只是一个字符串列表,所以我不知道" size"每一个都来自于,所以只需将其更改为dicts列表(其中没有#34;大小"键的条目)。

from collections import defaultdict
#import simplejson as json
import json  # using stdlib module instead

my_defaultdict = defaultdict(list, { 5: ['child10'],
                                    45: ['child92', 'child45'],
                                    33: ['child38']})

my_dict = {'name': 'flare',
           'children': [{'name': k,
                         'children': [{'name': child} for child in v]}
                            for k, v in my_defaultdict.items()]}

json_data = json.dumps(my_dict, indent=2)

print(json_data)

输出:

{
  "name": "flare",
  "children": [
    {
      "name": 33,
      "children": [
        {
          "name": "child38"
        }
      ]
    },
    {
      "name": 5,
      "children": [
        {
          "name": "child10"
        }
      ]
    },
    {
      "name": 45,
      "children": [
        {
          "name": "child92"
        },
        {
          "name": "child45"
        }
      ]
    }
  ]
}

答案 1 :(得分:1)

您需要构建字典,以便它包含所需的孩子'领域。 json.dumps不会在任何预定义架构中输出数据。相反,传递给json.dumps的对象必须已经遵循任何所需的结构。

尝试这样的事情:

my_defaultdict = {"name": "5",
                  "children":[ {"name": "child10", "children":[]}]}
print json.dumps(my_defaultdict)

答案 2 :(得分:0)

我用这个解决了:How to convert defaultdict to dict?

对于未来可能搜索它的人。我通过将 defaultdict 转换为普通字典来实现,只需调用:

b = defaultdict(dict)

a = dict(b)

然后 JSON 可以识别这种结构。