当前位置: 首页 > 面试题库 >

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

都建树
2023-03-14
问题内容

我有一个带有循环引用的结构。出于调试目的,我想将其转储。基本上是任何格式,但我选择了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是一个整数列表,程序必须在列表中返回两个不同的索引,这样它们的真实值加起来就是给定的目标。尽管这在大多数测试用例上运行良好,但它