[英]Using @JsonAnyGetter /@JsonAnySetter to Serialize JSON and change property name (Jackson)
[英]Jackson serialize class name as property for all objects
我想将所有POJO Jackson的类名序列化为JSON对象,以将其作为相应对象的属性包含在内。 理想情况下,这应该通过ObjectMapper或某些类似的常规设置来实现。
序列化示例:
public class MyClass {
private String someField;
private MyOtherClass anotherField;
}
至
{
"$type": "MyClass",
"someField": "abc",
"anotherField": {
"$type": "MyOtherClass",
...
}
}
我知道这也可以通过用类似的注释所有相应的类来完成
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "$type")
但我想避免这种情况。
我也尝试过
objectMapper.enableDefaultTypingAsProperty(ObjectMapper.DefaultTyping.JAVA_LANG_OBJECT, "$type")
这似乎没有用。
有这样的常规设置吗?
编辑:感谢AZWN的提示,通过使用DefaultTyping.NON_FINAL
定制和构造TypeResolverBuilder
,我实际上得到了我想要的TypeResolverBuilder
。
StdTypeResolverBuilder typer = new ObjectMapper.DefaultTypeResolverBuilder(ObjectMapper.DefaultTyping.NON_FINAL) {
@Override
public boolean useForType(JavaType t) {
return !(t.isCollectionLikeType() || t.isMapLikeType()) && super.useForType(t);
}
}
.init(JsonTypeInfo.Id.NAME, null)
.inclusion(JsonTypeInfo.As.PROPERTY)
.typeProperty("$type");
objectMapper.setDefaultTyping(typer);
您应该使用ObjectMapper.DefaultTyping.NON_FINAL
而不是ObjectMapper.DefaultTyping.JAVA_LANG_OBJECT
,因为当编译时类的字段类型为Object
时,后者仅包括类型属性。
有关更多信息,请参阅docs 。 另外,请注意他们提到的安全问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.