如何将`[(1,'item1'),(2,“item2”),(2,“item3”),(3,“item4”),(2,“item5”)]`转换为JSON python中的树和HTML树?

时间:2015-04-18 14:18:08

标签: python html json tree

我几个小时都来回走动,我似乎无法做到。

我一直在尝试将问题分解为if语句,如前一个数字<数字,然后创建一个子组,然后通过它,但我已经遇到麻烦缠绕我的头围绕一种方式轻松穿过树。我认为json会有工具允许我这样做,但我似乎无法找到任何工具。

我想将[(1, 'item1'),(2, "item2"),(2, "item3"),(3, "item4"),(2, "item5")]之类的元组列表转换为JSON和HTML。 我不认为我很清楚解释树的格式,所以我将进一步详细说明。 每个数字代表节点的级别,并且它是有序的,所以它应该是一个元组。 它显示为print '\t' * indent

Item1
    Item2
    Item3
        Item4
    Item5

每当数字递增时,所有带增量的项目都是前一个数字的子项。

Item1
    Child of Item1
    Child Item2
        Child of item2
        Child Item3
            Child of Item 3
        Child of item2
    Child of Item 1

当您将此有序列表放在一起时,您可以将其转换为Json树,如下所示,这正是我正在努力的方向。

{
 "name": "item1",
 "children": [
  {"name": "item2"}
  {
   "name": "item3",
   "children": [
     {"name": "item4"}
   ]
  }
  {"name": "item5"}
 ]
}

和HTML树

<div class="list">
    <ul>
        <li><span>item</span>
            <ul>
                <li>item2</li>
                <li><span>item3</span>
                    <ul>
                        <li>item4</li>
                    </ul>
                </li>
                <li>item5</li>
            </ul>
        </li>
    </ul>
</div>

需要x个项目。

1 个答案:

答案 0 :(得分:0)

以下代码非常递归,但是以JSON的形式提供了所需的结果。如果这是可以接受的,我将研究生成类似的HTML。

data = [(1, 'item1'), (2, "item2"), (2, "item3"), (3, "item4"), (2, "item5")]

import json


class Entity(object):
    def __init__(self, name=None, parent=None):
        self.name = name
        self.parent = parent
        self.level = parent.level + 1 if parent else 0
        self.children = []

    def to_json_obj(self):
        if len(self.children):
            return {'name': self.name, 'children': [child.to_json_obj() for child in self.children]}
        else:
            return {'name': self.name}


def data_to_json(data):
    tree = Entity()
    current = tree
    for item in data:
        if item[0] > current.level:
            pass
        else:
            while True:
                current = current.parent
                if current.level == item[0] - 1:
                    break
        new = Entity(item[1], current)
        current.children.append(new)
        current = new
    return json.dumps(tree.to_json_obj()["children"][0], indent=2)

print data_to_json(data)

给出输出

{
  "name": "item1",
  "children": [
    {
      "name": "item2"
    },
    {
      "name": "item3",
      "children": [
        {
          "name": "item4"
        }
      ]
    },
    {
      "name": "item5"
    }
  ]
}