Gson是怎么解决循环问题的

如题所述

Gson本身并不提供循环引用的直接解决方案。我们可以通过以下方式来解决循环引用的问题:

使用ava关键字transient

Java代码
private transient int value = 3;
在序列化的时候value不会生成到json字符串中。

使用Gson提供的注解@Expose

Java代码
@Exclude
private String value;

当然,要使用这个属性必须通过以下语句来构造Gson对象

Java代码
new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create()
我们也可以自定义注解来标注需要过滤的属性,参见官方的User Guide,需要使用到过滤策略,在下文也会提到。

使用排除策略

以上只能是通过“硬编码”的方式来排除属性,有些时候我们需要根据某种来选择性得过滤一些属性。这是我们可以使用使用Gson提供的排除策略ExclusionStrategy接口。如:

Java代码
public class MyExclusionStrategy implements ExclusionStrategy {
private MyExclusionStrategy(Class<?> typeToSkip) {

}

public boolean shouldSkipClass(Class<?> clazz) {
return false;
}

public boolean shouldSkipField(FieldAttributes f) {
return false;
}
}

我们可以通过类级别和属性级别来过滤属性。以上提到的关于自定义注解的实现是在属性级别上实现的。具体方法是

Java代码
public boolean shouldSkipField(FieldAttributes f) {
// Foo是一个自定义注解
return f.getAnnotation(Foo.class) != null;
}

一般情况下,我们可以通过根据属性名的判断来实现实现逻辑过滤。当然,在序列化之前,需要用一下代码来构造Gson对象:

Java代码
Gson gson = new GsonBuilder()
.setExclusionStrategies(new MyExclusionStrategy(SomeObject.class))
.create();

自定义序列化器
在有些情况下,我们可能会为某一个类来绑定一种序列化或反序列化器。

Java代码
public class MyAdaper1 implements JsonSerializer<DataStore> {

@Override
public JsonElement serialize(DataStore src, Type typeOfSrc,
JsonSerializationContext context) {
ExclusionStrategy strategy = new DmsExclusionStrategy(
src.getExcludeFields(), src.getExcludeClasses());
Gson gson = new GsonBuilder().setExclusionStrategies(strategy)
.serializeNulls().create();
return gson.toJsonTree(src);
}
}
注册序列化器:

Java代码
GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(MyType1.class, new MyTypeAdapter())
.registerTypeAdapter(MyType2.class, new MyTypeAdapter2());
温馨提示:答案为网友推荐,仅供参考

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网