将二叉树编码为json

将二叉树编码为json,json,sqlalchemy,binary-tree,Json,Sqlalchemy,Binary Tree,我正在使用sqlalchemy在数据库中存储二叉树数据: class Distributor(Base): __tablename__ = "distributors" id = Column(Integer, primary_key=True) upline_id = Column(Integer, ForeignKey('distributors.id')) left_id = Column(Integer, ForeignKey('distributors

我正在使用sqlalchemy在数据库中存储二叉树数据:

class Distributor(Base):
    __tablename__ = "distributors"

    id = Column(Integer, primary_key=True)
    upline_id = Column(Integer, ForeignKey('distributors.id'))
    left_id = Column(Integer, ForeignKey('distributors.id'))
    right_id = Column(Integer, ForeignKey('distributors.id'))
如何生成json树格式的数据,如上面所列:


{'id':1,子项:[{'id':2,子项:[{'id':3,'id':4}]}

我猜您要求以JSON格式存储数据?或者您正在尝试从标准关系数据构造JSON

如果是前者,为什么不创建如下条目:

{id: XX, parentId: XX, left: XX, right: XX, value: "foo"}
对于每个节点,然后根据条目手动重建树?只需从头parentId==null开始,然后组装分支


如果数据库中有多棵树,还可以为树本身添加额外的标识符。然后,您只需查询treeId是XXX的位置,然后根据条目构建树。

我不太愿意提供这个答案,因为我不确定我是否真的理解您的问题,您正在尝试解决的是二叉树、JSON、sqlalchemy,这些都不是问题

使用这种结构可以在每一行上进行迭代,同时添加边。您将从基本上是对象缓存开始;最终会成为你需要的树

import collections
idmap = collections.defaultdict(dict)
for distributor in session.query(Distributor):
    dist_dict = idmap[distributor.id]
    dist_dict['id'] = distributor.id
    dist_dict.setdefault('children', [])
    if distributor.left_id:
        dist_dict.['children'].append(idmap[distributor.left_id])
    if distributor.right_id:
        dist_dict.['children'].append(idmap[distributor.right_id])
因此,我们有一个可以代表树的链接目录的大集合。然而,我们不知道哪一个是根

root_dist = session.query(Distributor).filter(Distributor.upline_id == None).one()
json_data = json.dumps(idmap[root_dist.id])

你问的问题有一个非常简单的解决方案,但在此之前,你到底想做什么?分销商的左右子女究竟是什么?你想解决的问题是什么?想要或需要用逐顶点的行和固定的、命名为列的边表示的图是不常见的。