我有一个带有循环引用的结构。
出于调试目的,我想转储它。基本上任何格式都可以,但我选择了JSON。
由于它可以是任何类,所以我选择了不需要 JAXB 注释的 GSON。
但是 GSON 会遇到循环引用并递归直到StackOverflowError
.
我怎样才能限制GSON
有关的:Gson.toJson 给出 StackOverFlowError,在这种情况下如何获取正确的 json? (公共静态类) https://stackoverflow.com/questions/13460200/gson-tojson-gives-stackoverflowerror-how-to-get-proper-json-in-this-case-publ
只需将字段设置为瞬态(如private transient int field = 4;
)。 GSON 明白这一点。
Edit
不需要内置注释; 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();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)