杰克逊多态对象序列化/反序列化-未填充子类字段

时间:2019-01-06 17:27:16

标签: json spring jackson polymorphism

我有需要向REST Api发送/检索的多态类层次结构。

@JsonIgnoreProperties(ignoreUnknown = true) 
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = 
       JsonTypeInfo.As.PROPERTY, property = "@class")
public class Property implements IProperty, Serializable {
    private static final long serialVersionUID = 1L;

    private String name;

例如,其中一个是孩子:

public class PropertyEnum extends Property {
   private static final long serialVersionUID = 1L;

   private String value;
   private Collection<String> values = new LinkedList<String>();

当发送Property []数组以保留资源或将其取回时,我的PropertyEnum中的value字段为空且未填充! 另一方面,将填充值字段。 名称是肯定填充的,因为它在父类上。

我也尝试过:

//@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type", include =JsonTypeInfo.As.EXTERNAL_PROPERTY)
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, 
property = "name")
@JsonSubTypes(value = { 
   @JsonSubTypes.Type(value = PropertyEnum.class, name = "enum")
})

@JsonTypeName("enum")
public class PropertyEnum extends Property {

(尽管添加新类型时始终需要维护代码!)

再尝试一次:

@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=JsonTypeInfo.As.PROPERTY, 
property="objectType")
@JsonSubTypes({

    @JsonSubTypes.Type(value=PropertyEnum.class)
})
public class Property implements IProperty, Serializable {
private static final long serialVersionUID = 1L;

private String name;

protected Property(){}

...

@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=JsonTypeInfo.As.PROPERTY, 
property="objectType")
public class PropertyEnum extends Property {
    private static final long serialVersionUID = 1L;

    private String value;
    private Collection<String> values = new LinkedList<String>();

    protected PropertyEnum(){}

但是我有一个奇怪的行为...一个填充了子字段(值),另一个填充了(值)? 我两个都有设置器/获取器!

有什么主意吗?

致谢。

1 个答案:

答案 0 :(得分:0)

我仍然不知道为什么不填充一个字段而另一些填充字段,但是我通过将注释@JsonProperty添加到有问题的字段中来解决了这个问题。

我的解决方案:

@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, 
 property = "@class")
public class Property implements IProperty, Serializable {
   private static final long serialVersionUID = 1L;

   private String name;

   protected Property(){}

...

public class PropertyEnum extends Property {
private static final long serialVersionUID = 1L;
   @JsonProperty
   private String value;

   private Collection<String> values = new LinkedList<String>();

   protected PropertyEnum(){}