秋千
DefaultMutableTreeNode
类是类似树的数据结构
其中包含此类型的实例
children
作为
parent
.
这就是为什么gson的默认序列化程序遇到无限递归的原因。
然后扔了一个
StackOverflowError
.
要解决此问题,您需要自定义
Gson
聪明的人
JsonSerializer
专门为
默认可变TreeNode
S.
为了这个创造你的
格森
实例不只是由
new Gson()
但通过
Gson gson = new GsonBuilder()
.registerTypeAdapter(DefaultMutableTreeNode.class, new DefaultMutableTreeNodeSerializer())
.setPrettyPrinting()
.create();
这个
DefaultMutableTreeNodeSerializer
以下是责任
用于转换
默认可变TreeNode
给JSON。
它转换其属性
allowsChildren
,
leaf
,
userObject
和
儿童
给JSON。
请注意,它不会转换
起源
JSON的属性,
因为这样做会再次产生一个极小的递归。
public class DefaultMutableTreeNodeSerializer implements JsonSerializer<DefaultMutableTreeNode> {
@Override
public JsonElement serialize(DefaultMutableTreeNode src, Type typeOfSrc, JsonSerializationContext context) {
JsonObject jsonObject = new JsonObject();
jsonObject.addProperty("allowsChildren", src.getAllowsChildren());
jsonObject.addProperty("leaf", src.isLeaf());
jsonObject.add("userObject", context.serialize(src.getUserObject()));
JsonArray jsonArray = new JsonArray();
for (int i= 0; i < src.getChildCount(); i++) {
jsonArray.add(context.serialize(src.getChildAt(i)));
}
jsonObject.add("children", jsonArray);
return jsonObject;
}
}
对于测试,让我们序列化示例的根节点
JTree
.
JTree tree = new JTree(); // create a sample tree
Object topNode = tree.getModel().getRoot();
String jsonString = gson.toJson(topNode);
System.out.println(jsonString);
它生成以下JSON输出:
{
"allowsChildren": true,
"leaf": false,
"userObject": "JTree",
"children": [
{
"allowsChildren": true,
"leaf": false,
"userObject": "colors",
"children": [
{
"allowsChildren": true,
"leaf": true,
"userObject": "blue",
"children": []
},
{
"allowsChildren": true,
"leaf": true,
"userObject": "violet",
"children": []
},
{
"allowsChildren": true,
"leaf": true,
"userObject": "red",
"children": []
},
{
"allowsChildren": true,
"leaf": true,
"userObject": "yellow",
"children": []
}
]
},
{
"allowsChildren": true,
"leaf": false,
"userObject": "sports",
"children": [
{
"allowsChildren": true,
"leaf": true,
"userObject": "basketball",
"children": []
},
{
"allowsChildren": true,
"leaf": true,
"userObject": "soccer",
"children": []
},
{
"allowsChildren": true,
"leaf": true,
"userObject": "football",
"children": []
},
{
"allowsChildren": true,
"leaf": true,
"userObject": "hockey",
"children": []
}
]
},
{
"allowsChildren": true,
"leaf": false,
"userObject": "food",
"children": [
{
"allowsChildren": true,
"leaf": true,
"userObject": "hot dogs",
"children": []
},
{
"allowsChildren": true,
"leaf": true,
"userObject": "pizza",
"children": []
},
{
"allowsChildren": true,
"leaf": true,
"userObject": "ravioli",
"children": []
},
{
"allowsChildren": true,
"leaf": true,
"userObject": "bananas",
"children": []
}
]
}
]
}