使用writeValueAsString序列化对象后,Jackson反序列化失败

时间:2018-07-18 13:57:52

标签: java spring-boot serialization jackson deserialization

使用com.fasterxml.jackson.databind.ObjectMapper类(com.fasterxml.jackson.core:jackson-databind:2.9.5)我正在尝试反序列化以下类的对象:

class MyClass {

    String name;

    MyClass(String name) {
        this.name = name;
    }
}

我当前正在执行的代码如下:

    MyClass myClass = new MyClass("test");
    objectMapper.registerModule(new ParameterNamesModule())
        .registerModule(new Jdk8Module())
        .registerModule(new JavaTimeModule())
        .configure(FAIL_ON_UNKNOWN_PROPERTIES, false)
        .setVisibility(PropertyAccessor.FIELD, Visibility.ANY);

    String text = objectMapper.writeValueAsString(myClass);
    objectMapper.readValue(text, MyClass.class);

在最后一行失败并抛出异常:

  

com.fasterxml.jackson.databind.exc.MismatchedInputException:无法构造com.pckge.MyClass的实例(尽管存在至少一个Creator):无法从Object值反序列化(没有基于委托或基于属性的Creator)    在[来源:(String)“ {” name“:” test“}”;行:1,列:2]

我的目标是配置对象映射器,以便成功地反序列化对象,而无需在MyClass的构造函数上使用诸如JsonCreator或JsonProperties之类的注释:

  • 这可行吗?
  • 我缺少哪个配置?

非常感谢!

编辑1:@Dean的答复解决了该问题。但是,我也想避免使用默认的构造函数。

3 个答案:

答案 0 :(得分:6)

在没有默认构造函数的情况下解决此问题的正确方法是在类构造函数中添加JsonCreator和JsonProperty批注。

class MyClass {

    String name;

    @JsonCreator
    MyClass(@JsonProperty("name") String name) {
        this.name = name;
    }
    ...
}

答案 1 :(得分:4)

Jackson使用Getter和Setters来设置值。因此,您需要修改您的课程:

class MyClass {

    String name;

    MyClass(String name) {
      this.name = name;
   }

   MyClass(){}

   public void setName(String name) {
     this.name = name;
   }

  public String getName(String name) {
     return this.name;
  }
}

答案 2 :(得分:1)

如果您使用loombok,请删除该类的@Builder注释,这是我的问题