下面是一个例子,我想用这个例子来说明我的代码。
public class TreeNode {
private TreeNode parent;
private ArrayList<TreeNode> children;
private Object value;
//methods
}
我的GSon调用如下所示:
TreeNode headNode = getHeadNode();
Gson gson = new Gson();
Type typeOfSrc = new TypeToken<TreeNode>(){}.getType();
String gsonTreeString = gson.toJson(headNode,typeOfSrc);
当headNode
至少有一个子对象时,堆栈溢出发生了,我不明白为什么。有人能告诉我我做错了什么吗?
3条答案
按热度按时间tquggr8v1#
在Gson中,您可以创建一个自定义适配器来序列化表示树的数据结构。您需要的是序列化节点及其所有子节点。实现此目的的技巧是递归调用
write
方法来填充JsonWriter
。以下代码应该适用于您的示例:然后,要使用
TreeNodeAdapter
,只需示例化NodeTree
并使用GsonBuilder
和自定义适配器来序列化对象。pjngdqdw2#
成员父代指向其父代,而其父代又有一个子代指向子代,而子代又有一个父代指向父代...
dz6r00yl3#
Will是对的,问题是,有一个无限的路径要保存。你可以通过不保存父对象来解决这个问题。你可以在从JSON对象读取时设置父对象。为了避免保存父对象,只需将其设置为transient。
当转换回POJO时,您将调用下面的setParent-method。
setParents-method只遍历节点的所有子节点,并将它们的父节点设置为将该节点作为子节点的节点。