杰克逊错误:没有适合简单类的构造函数

Jul*_*ere 5 java json jackson

我很麻烦,这是我想用Jackson 2.3.2进行序列化/反序列化的类。序列化工作正常,但反序列化效果不好。

我有如下异常:

找不到适合类型[简单类型,类Series]的构造函数:无法从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

}
Run Code Online (Sandbox Code Playgroud)

而我的单元测试:

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());
    }
}
}
Run Code Online (Sandbox Code Playgroud)

这种异常是从方法抛出deserializeFromObjectUsingNonDefault()BeanDeserializerBase杰克逊LIB的。

任何的想法?

谢谢

Ale*_*lov 7

杰克逊不要求类具有默认构造函数。您可以使用@JsonCreator批注注释现有的构造函数,并使用该@JsonProperty批注将构造函数参数绑定到属性。注意:@JsonCreator如果您只有一个构造函数,甚至可以抑制它。

这种方法的优点是创建真正不变的对象,由于各种原因,这是件好事。

这是一个例子:

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));
    }
}
Run Code Online (Sandbox Code Playgroud)