我有一个二叉树类,如下所示:
class BTree:
def __init__(self, data, left=None, right=None):
self.data = data
self.left = left
self.right = right
def __unicode__(self):
return "%s" % self.data
我有另一个树序列化方法,如下所示:
class JTree(object):
def __init__(self, id, children=None):
self.id = id
if children is None:
children=[]
self.children = children
def encode_tree(obj):
if not isinstance(obj, JTree):
raise TypeError("%r is not JSON serializable" % (o,))
return obj.__dict__
然后我填充二进制树数据如下:
bt = BTree("1")
bt.left =BTree("2")
bt.right=BTree("3")
所以如果我序列化数据,我可以得到以下结果:
tree = JTree(bt.data, [JTree(bt.left.data), JTree(bt.right.data)])
print json.dumps(tree, default=encode_tree)
{"id": "1", "children": [{"id": "2", "children": []}, {"id": "3", "children": []}]}
问题是我无法弄清楚如何编写一段代码来生成结果。这意味着我想要一个生成器或递归函数来运行代码:
JTree(bt.data, [JTree(bt.left.data), JTree(bt.right.data)])
有人可以给我一个想法吗?感谢
答案 0 :(得分:2)
在我看来,你想要一个简单的递归函数,如:
def convert_to_jtree(bt):
return JTree(bt.data, [convert_to_jtree(bt.left) if bt.left else None,
convert_to_jtree(bt.right) if bt.right else None])
或类似的东西。
答案 1 :(得分:0)
json
模块只能序列化词典,列表,字符串,数字,布尔值和None
。不要使用自定义类,而应考虑使用普通的dict
。或者,您可以继承json.JsonEncoder
并覆盖default
方法,以便为自定义类返回其中一种类型。