当前位置: 首页 > 知识库问答 >
问题:

Jackson反序列化失败后序列化一个对象使用写ValueAsString

彭烨熠
2023-03-14

使用com。fasterxml。杰克逊。数据绑定。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);

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

通用域名格式。fasterxml。杰克逊。数据绑定。exc.MismatchedInputException:无法构造com的实例。pckge。MyClass(尽管至少存在一个创建者):无法从[Source:(String){“name”:“test”}处的对象值(没有基于委托或属性的创建者)反序列化;行:1,列:2]

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

  • 这可行吗
  • 我缺少哪种配置

谢谢!

编辑1:Dean的回复解决了问题。然而,我希望避免也使用默认构造函数。

共有3个答案

邹华皓
2023-03-14

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

朱睿
2023-03-14

Jackson使用Getter和setter设置值。因此,您需要修改您的类:

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;
  }
}
鲜于凯康
2023-03-14

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

class MyClass {

    String name;

    @JsonCreator
    MyClass(@JsonProperty("name") String name) {
        this.name = name;
    }
    ...
}
 类似资料:
  • 我需要一个自定义反序列化器来在复杂的POJO中转换字符串。反序列化工作直到使用反序列化器:特别是使用自定义反序列化器时,我的对象的非对象属性不会序列化。 我有一个restful Web服务,它有一个pojo作为参数。 所以我的类PreentivoWs需要一个方法。这里是类定义: 在jsonObject中,我有一个枚举定义为 但此对象需要转换反序列化程序: 并在财产上标注: fromString方法

  • 我目前正在开发一个Java web应用程序,它使用Magento REST API公开的JSON数据。api返回的数据示例如下: 我的应用程序中有一个Java类,如下所示: 我想对数据进行反序列化,并将其转换为,但我总是得到以下错误: 这是我用来将JSON响应反序列化为ArrayList的语句行: 有人能分享一些见解吗?我看到一些例子,返回的JSON对象前面没有任何ID。那是因为我做错了什么吗?非

  • 主要内容:1 编写核心类,2 运行测试本文讲解如何将一个Java对象序列化为一个json文件,然后读取该json文件读取回对象。在下面的示例中,我们创建Student类。使用Jackson存储到一个student.json文件,该文件拥有Student对象的JSON表示形式。 1 编写核心类 MainApp: 2 运行测试

  • 我有一个抽象的超类A,我有几个具体的子类B,C,D 在序列化方面,我执行以下操作: 没问题。我现在想反序列化这个。我知道我不能实例化一个抽象类,那么这是如何实现的呢? 这不起作用: 编辑:我把这个添加到我的抽象超类中:(仍然没有运气) 再次编辑:我现在遇到以下错误: 看看JSON,@class不在那里。我怎样才能做到?我试过: 但这并没有奏效。有这方面的例子吗?如何告诉对象映射器对类使用我的注释?

  • 我想将json反序列化到类Foo: IBar有两个实现,但是当反序列化时,我总是想使用第一个实现。(理想情况下,这将使问题变得更容易,因为不需要运行时类型检查) 我相信我可以编写自定义反序列化程序,但我觉得一定有更简单的方法。 我找到了这个注释,它在没有列表的情况下非常有效。

  • 我试图将JSON字符串反序列化为Java对象,但遇到以下异常: JsonDeserializer com.google.gson.DefaultTypeAdapters$CollectionTypeAdapter@306A30C7未能对给定类型类java.util.ArrayList的json对象[“93”]进行反序列化 我的主文件: 应该表示JSON的类是: 我尝试了SO上给出的解决方案,但也有