我假设我有一个父类参数,它有两个子类组合参数和整数参数
@JsonSubTypes({
@JsonSubTypes.Type(value = IntegerParameter.class, name = "integerParam"),
@JsonSubTypes.Type(value = ComboParameter.class, name = "comboParam")
})
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = As.WRAPPER_OBJECT)
public abstract class Parameter {
String regEx;
}
@JsonTypeName("integerParam")
public class IntegerParameter extends Parameter {
}
@JsonTypeName("comboParam")
public class ComboParameter extends Parameter {
List<String> values;
}
字符串
我有一个类,它有一个属性参数
class A {
@JsonUnwrapped
Parameter parameter;
}
型
对象A
的序列化抛出异常
com.fasterxml.Jackson.databind.JsonMappingException:Unwrapped属性需要使用类型信息:在不禁用SerializationFeature.FAIL_ON_UNWRAPPED_TYPE_IDENTIFIERS
的情况下无法序列化
如果我删除注解@JsonUnwrapped
,我将得到一个类似于That的json
{
parameter:{
integerParam:{
regEx: regExVal
}
}
}
型
我需要一个这样的JSON:
{
integerParam:{
regEx: regExVal
}
}
型
NB我使用的是Jackson2.4.4
2条答案
按热度按时间xmakbtuz1#
不要认为这个问题有简单而干净的解决方案。但这里有一些想法可以解决它(两种情况下都是Gist demo):
**选项1:**在属性上方添加
@JsonIgnore
,在顶级bean中添加@JsonAnyGetter
。易于实现,但在bean中使用静态ObjectMapper并不好,并且必须将此代码复制到每个带有参数属性的been中字符串
选项2:根
A
类的@JsonIgnore
属性和寄存器自定义序列化器/反序列化器型
不能在A类之上使用
@JsonSerialize
,因为ObjectMapper内部的序列化器和重复序列化器也将使用此注解,但您需要将其设置为使用默认的序列化器/重复序列化器,而不是递归地使用其本身。或者,如果您确实需要注解,可以实现类似https://stackoverflow.com/a/18405958/1032167的东西序列化器+并行化器看起来像这样(Unoptimized,只是一个概念证明):
型
泛型的序列化器很难写,但是这个问题是关于序列化的,根据问题的主体。
5tmbdcev2#
也许已经太晚了,但仍然为任何前来寻找的人发布。我设法使用@JsonAnyGetter的受控序列化解决了这个问题。使用具有不同@JsonProperty值属性的多个setter的多态序列化。
字符串
所有类型和子类型类都没有类型信息,即
型
最后,我们得到解包的Jsons如下:
型
和
型