繁体   English   中英

如何使用 Jackson 反序列化扩展 class

[英]How to deserialize extended class using Jackson

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

@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);
        
    }

Error: 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] 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]

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

@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;
    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM