用Gson遇到一个循环引用错误,如下:
java.lang.IllegalStateException: circular reference error Offending field:XXX Offending object: preserveType: false, type: XXX, obj: XXX
以上错误中“XXX”代表报错的类型,一下都用“XXX”表示。
解决方案就是自定义一个序列化函数,并将其注册到Gson对象中去,如下:
- class XXXSerializer implements JsonSerializer<XXX> {
-
- @Override
- public JsonElement serialize(XXX arg0, Type arg1,
- JsonSerializationContext arg2) {
- // TODO Auto-generated method stub
- JsonObject jsonObject = new JsonObject();
- <span style="white-space:pre"> </span>// 这里将XXX的一些属性设置到jsonObject中去
- return jsonObject;
- }
-
- }
然后用GsonBuilder注册XXX,并用GsonBuilder创建Gson,并用其转换成Json如下:
- <span style="white-space:pre"> </span>GsonBuilder gsonBuilder = new GsonBuilder();
- gsonBuilder.registerTypeAdapter(XXX.class, new TableSerializer());
- gsonBuilder.registerTypeAdapter(XXX.class,new <span style="font-family: Arial, Helvetica, sans-serif;">XXXSerializer</span><span style="font-family: Arial, Helvetica, sans-serif;">());</span>
- Gson gson = gsonBuilder.create();
- String string = gson.toJson(TestObject);
最后,如果不想某个属性被Gson转换成json,就用关键字transient修饰,如下:
- private transient String nanmeString;
最后附上我用到的参考链接:
点击打开链接
点击打开链接
|