serialization - 杰克逊序列化问题
问题描述
我在序列化/反序列化下面的类时遇到了一些问题。
我的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;
}
}
解决方案
例外很明显对吧?您需要为 ChildData 添加默认构造函数或注释现有构造函数,如下所示:
@JsonCreator
public ChildData(@JsonProperty("countryCode") String countryCode, @JsonProperty("zipCode") Optional<String> zipCode) {
this.countryCode = countryCode;
this.zipCode = zipCode;
}
推荐阅读
- excel - 如何在 Mac Excel 中获得 Pivot 中的不同计数?
- ubuntu - 如何在 CLion 中使用 WSL
- r - 试图反向转换时区向量
- python - 是否可以根据批次标签(y_true)分布更新每个批次的学习率?
- google-cloud-firestore - Firestore 安全测试仪 - 未找到获取功能
- android - 为 MaterialCardView 设置“外部”底部边缘无法按预期工作
- azure - 如何使用资源在 Azure 上创建容器注册表?
- html - 导航栏挂在标题上,不知道为什么?
- reactjs - React/Express.js:如何避免多次 API 调用
- wordpress - 具有多语言功能的 Wordpress 网站