【问题标题】: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() 引发的。

有什么想法吗?

谢谢

【问题讨论】:

    标签: java json jackson


    【解决方案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中如果没有构造函数,默认构造函数是隐式定义的

      这会导致意想不到的效果,如果没有任何构造函数并且您定义了一个非默认构造函数,那么(隐式)默认构造函数就会消失!像你之前的许多其他人一样,引导你去想知道发生了什么。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-30
        • 2018-08-02
        • 2012-08-04
        • 1970-01-01
        • 2015-07-16
        • 1970-01-01
        • 2015-01-23
        • 2020-10-19
        相关资源
        最近更新 更多