java - 尝试在杰克逊中反序列化时获得“无法构造实例”
问题描述
我正在尝试从 gson 迁移到 jackson。这令人沮丧,杰克逊在序列化方面做得更好(gson 会因各种原因在杰克逊毫无怨言地序列化的类上窒息)但是,gson 更擅长反序列化。
无法构造实例org.javautil.core.csv.SqlCsvExporterJson
(尽管至少存在一个 Creator):没有字符串参数构造函数/工厂方法可以从字符串值反序列化。
我已将其简化为一个简单的 bean,我对其进行序列化然后尝试反序列化。
该 bean 是使用 http://www.jsonschema2pojo.org/生成的
我的测试课:
package org.wank.core.csv;
import static org.junit.Assert.assertEquals;
import java.util.LinkedHashMap;
import org.junit.Test;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
public class SqlCsvExporterJsonParserTest {
@Test
public void testJacksonTwo() throws JsonProcessingException {
SqlCsvExporterJson exporter = new SqlCsvExporterJson();
exporter.setExportDateFormatString("yyyy-MM-dd");
exporter.setDateTimeFormatString("yyyy-MM-dd'T'HH:mm:ssXXX");
exporter.setSql("select * from a order by nbr");
ObjectMapper mapper = new ObjectMapper();
mapper.setSerializationInclusion(Include.NON_NULL);
mapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);
String json = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(exporter);
System.out.println(json);
SqlCsvExporterJson parser = mapper.convertValue(json, SqlCsvExporterJson.class);
assertEquals("yyyy-MM-dd",parser.getExportDateFormatString());
}
}
豆类:
package org.wank.core.csv;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
import org.apache.commons.lang.builder.ToStringBuilder;
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
"exportDateFormatString",
"dateTimeFormatString",
"sql",
"databaseMetaData",
"columnMeta"
})
public class SqlCsvExporterJson {
@JsonProperty("exportDateFormatString")
private String exportDateFormatString;
@JsonProperty("dateTimeFormatString")
private String dateTimeFormatString;
@JsonProperty("sql")
private String sql;
@JsonProperty("databaseMetaData")
private DatabaseMetaData databaseMetaData;
@JsonProperty("columnMeta")
private List<ColumnMetum> columnMeta = null;
@JsonIgnore
private Map<String, Object> additionalProperties = new HashMap<String, Object>();
/**
* No args constructor for use in serialization
*
*/
public SqlCsvExporterJson() {
}
/**
*
* @param exportDateFormatString
* @param databaseMetaData
* @param columnMeta
* @param sql
* @param dateTimeFormatString
*/
public SqlCsvExporterJson(String exportDateFormatString, String dateTimeFormatString, String sql, DatabaseMetaData databaseMetaData, List<ColumnMetum> columnMeta) {
super();
this.exportDateFormatString = exportDateFormatString;
this.dateTimeFormatString = dateTimeFormatString;
this.sql = sql;
this.databaseMetaData = databaseMetaData;
this.columnMeta = columnMeta;
}
@JsonProperty("exportDateFormatString")
public String getExportDateFormatString() {
return exportDateFormatString;
}
@JsonProperty("exportDateFormatString")
public void setExportDateFormatString(String exportDateFormatString) {
this.exportDateFormatString = exportDateFormatString;
}
@JsonProperty("dateTimeFormatString")
public String getDateTimeFormatString() {
return dateTimeFormatString;
}
@JsonProperty("dateTimeFormatString")
public void setDateTimeFormatString(String dateTimeFormatString) {
this.dateTimeFormatString = dateTimeFormatString;
}
@JsonProperty("sql")
public String getSql() {
return sql;
}
@JsonProperty("sql")
public void setSql(String sql) {
this.sql = sql;
}
@JsonProperty("databaseMetaData")
public DatabaseMetaData getDatabaseMetaData() {
return databaseMetaData;
}
@JsonProperty("databaseMetaData")
public void setDatabaseMetaData(DatabaseMetaData databaseMetaData) {
this.databaseMetaData = databaseMetaData;
}
@JsonProperty("columnMeta")
public List<ColumnMetum> getColumnMeta() {
return columnMeta;
}
@JsonProperty("columnMeta")
public void setColumnMeta(List<ColumnMetum> columnMeta) {
this.columnMeta = columnMeta;
}
@JsonAnyGetter
public Map<String, Object> getAdditionalProperties() {
return this.additionalProperties;
}
@JsonAnySetter
public void setAdditionalProperty(String name, Object value) {
this.additionalProperties.put(name, value);
}
@Override
public String toString() {
return new ToStringBuilder(this).append("exportDateFormatString", exportDateFormatString).append("dateTimeFormatString", dateTimeFormatString).append("sql", sql).append("databaseMetaData", databaseMetaData).append("columnMeta", columnMeta).append("additionalProperties", additionalProperties).toString();
}
}
这个 gson 测试:
package org.wank.core.csv;
import static org.junit.Assert.assertEquals;
import org.javautil.core.gson.SqlCsvExporterJsonGson;
import org.junit.Test;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
public class SqlCsvExporterJsonParserGsonTest {
@Test
public void testJacksonTwo() throws JsonProcessingException {
SqlCsvExporterJsonGson exporter = new SqlCsvExporterJsonGson();
exporter.setExportDateFormatString("yyyy-MM-dd");
exporter.setDateTimeFormatString("yyyy-MM-dd'T'HH:mm:ssXXX");
exporter.setSql("select * from a order by nbr");
Gson mapper = new GsonBuilder().setPrettyPrinting().create();
String json = mapper.toJson(exporter);
SqlCsvExporterJsonGson bean = mapper.fromJson(json, SqlCsvExporterJsonGson.class);
System.out.println(json);
assertEquals("yyyy-MM-dd",bean.getExportDateFormatString());
}
}
在这个 bean 上:
package org.wank.core.gson;
import java.util.List;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
import org.apache.commons.lang.builder.ToStringBuilder;
public class SqlCsvExporterJsonGson {
@SerializedName("exportDateFormatString")
@Expose
private String exportDateFormatString;
@SerializedName("dateTimeFormatString")
@Expose
private String dateTimeFormatString;
@SerializedName("sql")
@Expose
private String sql;
@SerializedName("databaseMetaData")
@Expose
private DatabaseMetaData databaseMetaData;
@SerializedName("columnMeta")
@Expose
private List<ColumnMetum> columnMeta = null;
/**
* No args constructor for use in serialization
*
*/
public SqlCsvExporterJsonGson() {
}
/**
*
* @param exportDateFormatString
* @param databaseMetaData
* @param columnMeta
* @param sql
* @param dateTimeFormatString
*/
public SqlCsvExporterJsonGson(String exportDateFormatString, String dateTimeFormatString, String sql, DatabaseMetaData databaseMetaData, List<ColumnMetum> columnMeta) {
super();
this.exportDateFormatString = exportDateFormatString;
this.dateTimeFormatString = dateTimeFormatString;
this.sql = sql;
this.databaseMetaData = databaseMetaData;
this.columnMeta = columnMeta;
}
public String getExportDateFormatString() {
return exportDateFormatString;
}
public void setExportDateFormatString(String exportDateFormatString) {
this.exportDateFormatString = exportDateFormatString;
}
public String getDateTimeFormatString() {
return dateTimeFormatString;
}
public void setDateTimeFormatString(String dateTimeFormatString) {
this.dateTimeFormatString = dateTimeFormatString;
}
public String getSql() {
return sql;
}
public void setSql(String sql) {
this.sql = sql;
}
public DatabaseMetaData getDatabaseMetaData() {
return databaseMetaData;
}
public void setDatabaseMetaData(DatabaseMetaData databaseMetaData) {
this.databaseMetaData = databaseMetaData;
}
public List<ColumnMetum> getColumnMeta() {
return columnMeta;
}
public void setColumnMeta(List<ColumnMetum> columnMeta) {
this.columnMeta = columnMeta;
}
@Override
public String toString() {
return new ToStringBuilder(this).append("exportDateFormatString", exportDateFormatString).append("dateTimeFormatString", dateTimeFormatString).append("sql", sql).append("databaseMetaData", databaseMetaData).append("columnMeta", columnMeta).toString();
}
}
工作正常。
解决方案
推荐阅读
- css - 如何有条件地在css中应用样式
- android - Gradle 3“编译项目”和“编译文件”已弃用?
- python - 使用 Python Matplotlib 使用 Start、End、Center 和 Radius 将弧绘制为多边形
- delphi - 如何处理浮点数逼近?
- loops - Clojure - 使用循环递归的斐波那契 - 进入无限循环
- postgresql - 夏季和冬季 postgres 时区/时间戳
- javascript - 用 pg-promise 中断一个长事务
- java - 输入不匹配异常错误?
- c++ - 没有 return 语句的函数中的 c++ 返回什么?
- c# - 将 C# 代码转换为 PHP:创建空字节数组 php 并使用套接字发送