首页 > 解决方案 > 杰克逊序列化问题

问题描述

我在序列化/反序列化下面的类时遇到了一些问题。

我的Data班级拥有其他班级的清单。

当我在类中调用序列化/反序列化方法时Data,出现以下错误:

Caused by: com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of com.amazon.rancor.storage.types.ChildData: no suitable constructor found, can not deserialize from Object value (missing default constructor or creator, or perhaps need to add/enable type information?)

错误来自反序列化方法。但我也相信序列化无法正常工作。这是序列化Data对象的样子:

{childData:[{zipCode:{present:true},countryCode:"US"}]

即使我设置了可选字段,也没有正确序列化该objectMapper.registerModule(new Jdk8Module());字段


我似乎无法弄清楚我做错了什么。也许我需要在课堂上改变一些ChildData东西。ChildDataV2但我不确定是什么。

任何指针将不胜感激!


public class Data {
    private List<ChildData> childData;
    private List<ChildDataV2> childDataV2;

    private static ObjectMapper objectMapper;
    static {
        objectMapper = new ObjectMapper();
        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        objectMapper.registerModule(new Jdk8Module());
    }

    public Data() { }

    @JsonCreator
    public Data(@JsonProperty("childData") final List<ChildData> childData,
                          @JsonProperty("childDataV2") final List<ChildDataV2> childDataV2) {
        this.childData = childData;
        this.childDataV2 = childDataV2;
    }

    public List<ChildData> getChildData() {
        return childData;
    }
    
    public void setChildData(final List<ChildData> childData) {
        this.childData = childData;
    }

    public List<ChildDataV2> getChildDataV2() {
        return childDataV2;
    }

    public void setChildDataV2(final List<ChildDataV2> childDataV2) {
        this.childDataV2 = childDataV2;
    }

    public String serialize() {
        try {
            return objectMapper.writeValueAsString(this);
        } catch (JsonProcessingException e) {
            throw new RuntimeException("Failed to serialize. Data: " + this, e);
        }
    }

    public Data deSerialize(final String data) {
        try {
            return objectMapper.readValue(data, Data.class);
        } catch (IOException e) {
            throw new RuntimeException("Failed to deserialize. Data" + data, e);
        }
    }
}
public class ChildData {
    private final String countryCode;
    private final Optional<String> zipCode;

    public ChildData(final String countryCode, final Optional<String> zipCode) {
        this.countryCode = countryCode;
        this.zipCode = zipCode;
    }

    public Optional<String> getZipCode() {
        return zipCode;
    }

    public String getCountryCode() {
        return countryCode;
    }
}
public class ChildDataV2 extends ChildData {
    private final Object struct;

    public ChildDataV2(final String cc, final Optional<String> postalCode,
        final Object struct) {
        super(cc, postalcode);
        this.struct = struct;
    }
}

标签: serializationjacksondeserializationjackson-databind

解决方案


例外很明显对吧?您需要为 ChildData 添加默认构造函数或注释现有构造函数,如下所示:

@JsonCreator
public ChildData(@JsonProperty("countryCode") String countryCode, @JsonProperty("zipCode") Optional<String> zipCode) {
    this.countryCode = countryCode;
    this.zipCode = zipCode;
}

推荐阅读