【问题标题】:How to deserialize extended class using Jackson to include Base class fields如何使用 Jackson 反序列化扩展类以包含基类字段
【发布时间】:2022-01-09 13:00:15
【问题描述】:

在由Ext 类扩展的给定类Base 中。序列化工作完美,但问题是在尝试将序列化字符串反序列化回Ext 类时。我想反序列化回 Ext 类,包括所有 Base 类字段。

@Data、@NonFinal、@Value 都是 lombok 注解。

@Data
public class Base {

    private String foo;

    public Base( String foo) {
        this.foo = foo;
    }
}
@Value
@NonFinal
public class Ext extends Base  {

    private String bar;

    public Ext(String foo,  String bar) {
        super(foo);
        this.bar = bar;
    }

}

反序列化方法

    @Test
    void shouldDeserialize() throws IOException {

        ObjectMapper mapper = new ObjectMapper();
        Ext ext = new Ext("foo", "bar");

        String serializedExt = mapper.writeValueAsString(ext);
        System.out.println(serializedExt); // {"foo":"foo","bar":"bar"}
        
        // Throws err
        base = mapper.readValue(serializedExt, Ext.class);
        
    }

错误:com.fasterxml.jackson.databind.exc.InvalidDefinitionException:Cannot construct instance of ..Inhertence.Ext(no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator) at [Source: (String)"{"foo":"foo","bar":"bar"}"; line: 1, column: 2]

【问题讨论】:

标签: java jackson deserialization jackson-databind


【解决方案1】:

错误消息是指示性的:在您的类中,默认构造函数不存在,并且您没有使用 JsonCreator 注释对其构造函数进行注释。您可以反序列化您的类并注释其构造函数:

@Value
@NonFinal
public class Ext extends Base {

    private String bar;

    @JsonCreator
    public Ext(@JsonProperty("foo") String foo, @JsonProperty("bar") String bar) {
        super(foo);
        this.bar = bar;
    }

}

【讨论】:

  • 谢谢,但是在反序列化 (Ext(bar=bar)) 时,不包含基类字段。是否也可以包含所有基类字段。 ?预期结果为Ext(bar=bar, foo=foo)
  • @SK 其实Ext的反序列化已经完成了。只有ExttoString() 输出不完整。将@ToString(callSuper=true) 添加到您的Èxt 类中,它会正常工作。
  • @SK 欢迎您。正如 Thomas Fritsch 在他的评论中解释的那样,您必须将 @ToString 注释添加到您的课程中。
猜你喜欢
  • 2021-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多