杰克逊错误:没有适合简单类的构造函数
Posted
技术标签:
【中文标题】杰克逊错误:没有适合简单类的构造函数【英文标题】:Jackson error : no suitable constructor for a simple class 【发布时间】:2014-09-25 22:05:06 【问题描述】:我遇到了麻烦,这是我想用 Jackson 2.3.2 序列化/反序列化的类。 序列化工作正常,但反序列化不行。
我有如下异常:
没有找到适合类型[简单类型,类系列]的构造函数:无法从 JSON 对象实例化(需要添加/启用类型信息?)
最奇怪的是,如果我评论构造函数,它会完美运行!
public class Series
private int init;
private String key;
private String color;
public Series(String key, String color, int init)
this.key = key;
this.init = init;
this.color = color;
//Getters-Setters
还有我的单元测试:
public class SeriesMapperTest
private String json = "\"init\":1,\"key\":\"min\",\"color\":\"767\"";
private ObjectMapper mapper = new ObjectMapper();
@Test
public void deserialize()
try
Series series = mapper.readValue(json, Series.class);
catch (IOException e)
Assert.fail(e.getMessage());
此异常是从 Jackson lib 的 BeanDeserializerBase
的方法 deserializeFromObjectUsingNonDefault()
引发的。
有什么想法吗?
谢谢
【问题讨论】:
【参考方案1】:Jackson 没有强制要求类具有默认构造函数。您可以使用the @JsonCreator annotation 注释现有构造函数,并使用@JsonProperty
注释将构造函数参数绑定到属性。
注意:@JsonCreator
如果你有单个构造函数,甚至可以被抑制。
这种方法具有创建真正不可变对象的优势,这对于各种good reasons 来说是一件好事。
这是一个例子:
public class JacksonImmutable
public static class Series
private final int init;
private final String key;
private final String color;
public Series(@JsonProperty("key") String key,
@JsonProperty("color") String color,
@JsonProperty("init") int init)
this.key = key;
this.init = init;
this.color = color;
@Override
public String toString()
return "Series" +
"init=" + init +
", key='" + key + '\'' +
", color='" + color + '\'' +
'';
public static void main(String[] args) throws IOException
ObjectMapper mapper = new ObjectMapper();
String json = "\"init\":1,\"key\":\"min\",\"color\":\"767\"";
System.out.println(mapper.readValue(json, Series.class));
【讨论】:
【参考方案2】:您没有默认(即无参数)构造函数。
定义一个无参数构造函数:
public Series()
注释掉3-arg构造函数时它起作用的原因是在java中如果没有构造函数,默认构造函数是隐式定义的。
这会导致意想不到的效果,如果没有任何构造函数并且您定义了一个非默认构造函数,那么(隐式)默认构造函数就会消失!像你之前的许多其他人一样,引导你去想知道发生了什么。
【讨论】:
以上是关于杰克逊错误:没有适合简单类的构造函数的主要内容,如果未能解决你的问题,请参考以下文章