有没有办法以编程方式告诉杰克逊忽略一处房产?例如,按名称。
我的问题是我正在序列化第三方对象,其中一些具有导致
的父/子循环依赖性com.fasterxml.jackson.databind.JsonMappingException: Infinite recursion (StackOverflowError)
因为我无法修改代码,the usual ways of breaking cyclic dependencies对我不起作用。
我正在使用ObjectMapper
和ObjectWriter
:
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");
答案 0 :(得分:5)
你应该使用杰克逊的Mix-In Annotations打破循环依赖:
objectMapper.getSerializationConfig().addMixInAnnotations(ClassWithParent.class, SuppressParentMixIn.class);
然后定义SuppressParentMixIn
:
public interface SuppressParentMixIn {
@JsonIgnore
public ParentClass getParent();
}
这允许您以编程方式在不受控制的类上插入注释。每当杰克逊序列化ClassWithParent
时,它就会像SuppressParentMixIn
中的所有注释都应用于ClassWithParent
一样。