我有一个带有循环引用的结构。出于调试目的,我想将其转储。基本上是任何格式,但我选择了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();
我有一个循环引用的结构。出于调试的目的,我想转储它。基本上可以是任何格式,但我选择了JSON。 由于它可以是任何类,我选择了不需要JAXB注释的GSON。 但是GSON会命中循环引用并递归,直到。 如何将 GSON 限制为 > 忽略某些类成员?不遵守和。 忽略某些对象图路径?例如,我可以指示GSON不要序列化< code > release . custom fields . product 。
今天,我开始使用MapSTRt为我的项目创建我的模型到DTO转换器,我想知道它是否自动处理循环引用,但事实证明它没有。 这是我用来测试它的转换器: 这就是测试: Notifica、AvvisionNotifica及其各自的模型都是带有setter和getter的简单POJO,因此我认为无需发布代码(如果您想知道,Notifica扩展了Corrispondenza) 这段代码进入了一个无限的循环,这
我在反序列化遵循以下格式的Json数组时遇到了一些问题: 它基本上是一个类别数组,其中每个类别也可以有一个子类别列表,依此类推。我的类模型看起来有点像这样: 现在,Gson显然抱怨循环引用。有没有办法解析这个Json输入,因为我不能假设有多少个类别级别?提前感谢。 编辑:以防万一有人有类似的问题,根据Spaeth的回答,我将解决方案调整为使用反射的更一般的情况。唯一的要求是JSON数组表示的对象列
我有三块地 小时——分钟——和总数 如果小时或分钟发生变化,我想计算一个总数。如果总数发生变化,我想计算相应的分钟和小时数。 例子: 1h 30分钟=1.5总计 2.25总计=2h 15分钟 我正试图用手表来达到这个目的 但是,这会导致一个循环,因为on处理程序总是调用另一个处理程序。如何以更明智的方式实现这一点?
我搜索了Google、StackOverflow和Github问题,但没有找到任何内容 https://docs.temporal.io/docs/java-implementing-workflows#child-workflows 似乎我可以轻松地创建一个包含多个工作流的圆圈,将其他人称为子工作流。工作流甚至可以一遍又一遍地调用自己。节奏/时间是否提供任何东西来防止这种情况或超出范围? 提前感
我目前正在Leetcode中处理问题1,名为“两个和” 给定一个整数数组,返回两个数字的索引,使它们相加到一个特定的目标。 您可以假设每个输入都有一个精确的解决方案,并且您可以不使用相同的元素两次。 示例:给定, 因为,所以返回。 我目前的代码是: 在这种情况下,Nums是一个整数列表,程序必须在列表中返回两个不同的索引,这样它们的真实值加起来就是给定的目标。尽管这在大多数测试用例上运行良好,但它