GSON:如何在保持循环引用的同时防止StackOverflowError?

我有一个带有循环引用的结构。出于调试目的,我想将其转储。基本上是任何格式,但我选择了JSON。

由于可以是任何类,因此我选择了不需要JAXB批注的GSON。

但是GSON击中了循环引用并递归直到StackOverflowError

如何将GSON限制为

  • 忽略某些班级成员?两者@XmlTransient@JsonIgnore都不服从。

  • 忽略某些对象图路径?例如,我可以指示GSON不要序列化release.customFields.product

  • 最多达到2个级别的深度?

回答:

只需将字段设为瞬态(如中的private transient int field = 4;)。GSON明白这一点。

无需内置注释;Gson使您可以插入自己的策略来排除字段和类。它们不能基于路径或嵌套级别,但是可以使用注释和名称。

如果要跳过类“ my.model.Person”上名为“ lastName”的字段,则可以编写如下的排除策略:

class MyExclusionStrategy implements ExclusionStrategy {

public boolean shouldSkipField(FieldAttributes fa) {

String className = fa.getDeclaringClass().getName();

String fieldName = fa.getName();

return

className.equals("my.model.Person")

&& fieldName.equals("lastName");

}

@Override

public boolean shouldSkipClass(Class<?> type) {

// never skips any class

return false;

}

}

我也可以做自己的注释:

@Retention(RetentionPolicy.RUNTIME)

public @interface GsonRepellent {

}

并将shouldSkipField方法重写为:

public boolean shouldSkipField(FieldAttributes fa) {

return fa.getAnnotation(GsonRepellent.class) != null;

}

这将使我能够执行以下操作:

public class Person {

@GsonRepellent

private String lastName = "Troscianko";

// ...

要使用自定义ExclusionStrategy,请使用构建器构建Gson对象:

Gson g = new GsonBuilder()

.setExclusionStrategies(new MyOwnExclusionStrategy())

.create();

以上是 GSON:如何在保持循环引用的同时防止StackOverflowError? 的全部内容, 来源链接: utcz.com/qa/409778.html

回到顶部