在java中的jackson json反序列化期间忽略缺少的属性

use*_*151 41 java serialization json jackson

在示例中

class Person {
   String name;
   int age;
}
Run Code Online (Sandbox Code Playgroud)

如果json对象缺少属性'age',

{
  name : John
}

Person person = objectMapper.readValue(jsonFileReader, Person.class);
Run Code Online (Sandbox Code Playgroud)

它抛出一个JsonMappingException,说它不能反序列化.是否有注释在反序列化期间忽略缺少的字段?

谢谢

Gus*_*ias 81

@JsonIgnoreProperties(ignoreUnknown = true) 在班级上为我工作

  • 这不是问题的答案。仅当传入的 JSON 消息包含的属性多于您尝试序列化到的对象时,“JsonIgnoreProperties(ignoreUnknown = true)”才有用。 (26认同)
  • 这是有效的,但在更高的层次上。请注意,因为它会阻止系统在json参数“不匹配”的情况下触发异常。 (3认同)
  • @TamasG.that 可能是这个注释的意图,但不能否认它确实可以解决问题(至少从 Jackson 2.1.1 开始)。 (3认同)

ped*_*rro 45

我想你想要的是什么

@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
public class Person {
  ...
}
Run Code Online (Sandbox Code Playgroud)

那是Jackson 1.x的方式.我认为在2.x中有一种新的方式.就像是

@JsonInclude(Include.NON_NULL)
public class Person {
  ...
}
Run Code Online (Sandbox Code Playgroud)

这些将告诉Jackson只序列化非空值,并且在反序列化缺失值时不要抱怨.我认为它只会将其设置为Java默认值.

  • 序列化对象时`@JsonInclude`效果,但这个问题是关于反序列化JSON. (16认同)

Fır*_*ÇÜK 24

基于注释的方法是忽略但是如果需要的更好方法.手动反序列化方式:

ObjectMapper mapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
Person       person = mapper.readValue(jsonFileReader, Person.class);
Run Code Online (Sandbox Code Playgroud)

  • @jayeffkay一般来说,只关注Pojo而不是反序列化逻辑是首选方式.您可以将其视为与ORM实体手动创建JDBC连接.但如果您想要一个自定义解决方案.欢迎使用手动方式. (3认同)
  • 使用注释还是逻辑更好取决于具体情况。通过将注释放在 pojo 上,它将 pojo 与底层序列化机制联系起来,这在某些情况下是不可取的。请注意,名称“plain old Java object”本身暗示该对象是“plain”对象,而不是与特定技术相关的对象(当然,Java 除外!) (3认同)
  • 我认为当遗留代码无法更改时,手动方式很有用。例如,实现 E2E 测试,其中序列化/反序列化是处理对象的主要部分,但代码本身无法更改。 (2认同)

RCv*_*ram 8

在反序列化中,可能会发生两种情况。

我们在 JSON String 中有一个新字段,而不是在 Java Bean 中,这对于对象映射器来说是一个未知属性。要忽略未知属性,需要如下配置对象映射器配置

ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
Run Code Online (Sandbox Code Playgroud)

如果某个字段不在JSON String 中而是在 Java Bean 中,则该字段将被对象映射器视为缺失属性。为了避免因缺少属性而失败,需要按如下方式配置对象映射器配置,但这是 Jackson 库的现代版本 (2.9.6) 的默认行为。

ObjectMapper().configure(DeserializationFeature.FAIL_ON_MISSING_CREATOR_PROPERTIES, false)


Moi*_*sés 5

默认情况下,现代版本(2.9.6)的Jackson库将忽略缺少的创建者属性。但是,如果将ObjectMapper配置设置为:

ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_MISSING_CREATOR_PROPERTIES, true);
Run Code Online (Sandbox Code Playgroud)

如果缺少其中一个属性,则会收到反序列化错误。

  • 查看“DeserializationFeature.FAIL_ON_MISSING_CREATOR_PROPERTIES”的 Javadoc,这似乎是自 Jackson 2.6(即自 2015 年 7 月以来)以来的行为。 (3认同)
  • 这就是为我解决问题的答案。Jackson 的默认行为 **将缺失的原始属性反序列化为 0/false** 太疯狂了,它应该是选择加入而不是选择退出。我在尝试将 JSON 数字反序列化为 Kotlin 数据类(带有构造函数属性)时遇到了这个问题,并且只首先找到了 /sf/ask/1010427561/ 。 (2认同)