用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;