我有这个代表树的类......
import java.util.Iterator; import java.util.LinkedList; import java.util.List; public class Leitur<T> implements Iterable<Leitur<T>> { T data; Leitur<T> parent; List<Leitur<T>> children; public Leitur(T data) { this.data = data; this.children = new LinkedList<Leitur<T>>(); } public Leitur<T> addChild(T child) { Leitur<T> childNode = new Leitur<T>(child); childNode.parent = this; this.children.add(childNode); return childNode; } @Override public Iterator<Leitur<T>> iterator() { return null; } }
...
Leitur<String> root = new Leitur<String>("aaa"); Leitur<String> node0 = root.addChild("node0"); Leitur<String> node00 = node0.addChild("node00"); Leitur<String> node000 = node00.addChild(null); Leitur<String> node1 = root.addChild("node1"); Leitur<String> node10 = node1.addChild("node10"); Leitur<String> node100 = node10.addChild(null); String text = new Gson().toJson(root);
问题是Gson无法产生预期的文本。不能说明什么。有什么想法吗?
AndroidRuntime:FATAL EXCEPTION:main进程:pt.sys.opencvdemo,PID: 13475 java.lang.StackOverflowError:堆栈大小为8MB at com.google.gson.stream.JsonWriter.writeDeferredName(JsonWriter.java:401) 在com.google.gson.stream.JsonWriter.beginArray(JsonWriter.java:287) 在 com.google.gson.internal.bind.CollectionTypeAdapterFactory $ Adapter.write(CollectionTypeAdapterFactory.java:95) 在 com.google.gson.internal.bind.CollectionTypeAdapterFactory $ Adapter.write(CollectionTypeAdapterFactory.java:61) 在com.google.gson.Gson $ FutureTypeAdapter.write(Gson.java:976)at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69)
答案 0 :(得分:1)
我想将此问题标记为以下问题的副本,但似乎我不能这样做,因为那个问题没有得到接受。但基本上,解决方案就在那里。
Getting stackoverflowerror from Gson while converting hashmap to JSON object
那么我们如何解决这个问题呢?这取决于你想要的行为。一个简单的选择是阻止Gson尝试序列化父字段(我们不需要它,因为我们可以从子列表重建它)。要做到这一点,只需将父标记为瞬态,Gson不会将其包含在结果中。