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

Jackson反序列化缺失的默认值

万俟心思
2023-03-14

我尝试使用以下代码反序列化API中接收的JSON对象:

ObjectMapper mapper = new ObjectMapper();
ExampleDto ed = mapper.readValue(req.body(), ExampleDto.class);

我的类使用Lombok生成构造函数、getter和setter,如下所示:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class ExampleDto {
    private String name = "";
    private List<String> values = new LinkedList<>();
}

这两个属性都应该是可选的,如果没有提供,则使用类定义中指定的默认值。但是,如果我现在尝试反序列化JSON

{name: "Foo"}

values字段为null。根据我的理解,以及我找到的所有示例代码,应该是一个空列表。

编辑:不是重复的,因为我使用的是没有选项的Lombok

共有1个答案

姬选
2023-03-14

@allargsconstuctor创建以下构造函数

@ConstructorProperties({"name", "values"})
ExampleDto(String name, List<String> values) {
    this.name = name;
    this.values = values;
}

构造函数用@ConstructorProperties注释,这意味着基于属性的创建者(采用参数的构造函数或工厂方法)可用于实例化JSON对象中的值,因此jackson databind使用此构造函数实例化ExampleDto类中的对象。

当以下行执行时

mapper.readValue("{\"name\": \"Foo\"}", ExampleDto.class);

因为在提供的JSON中没有values的值,所以在调用构造函数时,为第二个参数传递null

如果您删除了@AllArgsConstructor注释,jackson-Dataind将使用setter方法初始化对象,在这种情况下,不会为null

 类似资料:
  • 像这样: 我该怎么办?

  • 我想通过扩展默认的反序列化器来创建自己的反序列化器,在其后面设置更多的值: 如您所见,我还想将此DTO母类重用于其他DTO。 我没有找到任何这样的例子。我真的是世界上第一个 反序列化的“AsUsual”(p,ctxt)应该是什么 我应该使用什么motherclass?JsonDeserializer/StdDeserializer/UntypedObjectDeserializer 反序列化程序会

  • 当反序列化各种JSON消息时,我希望为某种类型的属性提供默认值。通常建议简单地在类中指定值,但如果必须跨许多类这样做,这很容易出错。您可能会忘记一个值,并以而不是默认值结束。我的意图是将每个的属性设置为。由于正是试图消除的内容,因此将它们与Jackson一起使用是令人沮丧的。 Jackson允许您自定义反序列化过程的大多数特性都集中在作为输入的JSON上,而不是围绕实例化要反序列化到的对象的过程。

  • 我的JSON字符串是: 我想要实现的是,当JSON中没有提供schemaVersion时,能够在默认情况下反序列化到SubClassV1,但即使在Superclass中将schemaVersion初始化为“1.0”时,我仍然会收到以下错误:

  • 假设我正在为某个类编写自定义序列化,但希望使用默认方法处理其中一个字段。 那要怎么做? 序列化时,我们有。 但反序列化的相应方法是什么? 请注意以下代码: 如何实现MyOuterDeserializer?

  • 我在Jackson的自定义反序列化程序中有一个问题。我想访问默认序列化程序来填充我要反序列化到的对象。在填充之后,我将执行一些自定义操作,但首先我要使用默认的Jackson行为反序列化对象。 这是我现在有的代码。 我需要的是一种初始化默认反序列化器的方法,这样我就可以在开始我的特殊逻辑之前预填充我的POJO。 当从自定义反序列化程序内调用deserialize时,无论我如何构造序列化程序类,该方法