杰克逊在第三方课程中无限递归的解决方法

时间:2016-03-18 14:53:24

标签: java json jackson cyclic-reference

有没有办法以编程方式告诉杰克逊忽略一处房产?例如,按名称。

我的问题是我正在序列化第三方对象,其中一些具有导致

的父/子循环依赖性
com.fasterxml.jackson.databind.JsonMappingException: Infinite recursion (StackOverflowError)

因为我无法修改代码,the usual ways of breaking cyclic dependencies对我不起作用。

我正在使用ObjectMapperObjectWriter

ObjectMapper mapper = new ObjectMapper();
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
mapper.setVisibility(new VisibilityChecker.Std(JsonAutoDetect.Visibility.ANY));
writer = mapper.writerWithDefaultPrettyPrinter();
writer.writeValueAsString(object);

我知道它们是高度可定制的,就像我在代码片段中包含的序列化包含和可见性一样,但是我找不到它们实现类似

的方式
mapper.ignoreProperty("parent");

1 个答案:

答案 0 :(得分:5)

你应该使用杰克逊的Mix-In Annotations打破循环依赖:

objectMapper.getSerializationConfig().addMixInAnnotations(ClassWithParent.class, SuppressParentMixIn.class);

然后定义SuppressParentMixIn

public interface SuppressParentMixIn {

    @JsonIgnore
    public ParentClass getParent();

}

这允许您以编程方式在不受控制的类上插入注释。每当杰克逊序列化ClassWithParent时,它就会像SuppressParentMixIn中的所有注释都应用于ClassWithParent一样。