📜  Jackson UnrecognizedPropertyException:字段 Ignorable (1)

📅  最后修改于: 2023-12-03 14:42:11.779000             🧑  作者: Mango

Jackson UnrecognizedPropertyException: Ignorable field

在使用 Jackson 库进行 Java 对象(POJO)与 JSON 互转的过程中,可能会出现 UnrecognizedPropertyException 异常,提示“未识别的属性”,其中有可能会有一个 Ignorable 的字段,本文将介绍该异常的原因、解决方案及示例代码。

1. 原因

当在反序列化 JSON 时,Jackson 会将 JSON 中的属性映射为 Java POJO 对象的属性,如果 JSON 中包含了 Java POJO 中不存在的属性,那么 Jackson 将会抛出 UnrecognizedPropertyException 异常。这意味着你需要在 POJO 类中声明一个新的属性来匹配此属性,或者使用 @JsonIgnoreProperties 注解来忽略未知属性。

但是,如果你使用了 Jackson 可忽略未知属性的特性,在 ObjectMapper 中调用 configure 方法,设置 DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIESfalse,那么你还会在 UnrecognizedPropertyException 异常消息中看到一个 Ignorable 字段。

这个字段是一个布尔值,指示该属性是否已经在 @JsonIgnoreProperties 注解中指定为可忽略的属性。

2. 解决方案

出现 UnrecognizedPropertyException 异常的最常见原因是因为 JSON 中包含了 Java POJO 中不存在的属性。因此,解决该异常的方法通常有两种:

  • 在 POJO 类中声明一个新的属性来匹配 JSON 中的属性
  • 使用 @JsonIgnoreProperties 注解忽略未知属性

示例代码:

// POJO
public class User {
    private String name;
    private int age;

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

// JSON
{
  "name": "John",
  "age": 25,
  "occupation": "Programmer"
}

// 解决方案一:声明新的属性
public class User {
    private String name;
    private int age;
    private String occupation; // 声明新属性

    // 省略 getter 和 setter 方法
}

// 解决方案二:使用 @JsonIgnoreProperties 注解
@JsonIgnoreProperties(ignoreUnknown = true)
public class User {
    private String name;
    private int age;

    // 省略 getter 和 setter 方法
}
3. 总结

UnrecognizedPropertyException 异常通常是因为 JSON 中包含了 Java POJO 中不存在的属性而引起的。解决该异常的方法通常为声明新的属性或使用 @JsonIgnoreProperties 注解忽略未知属性。当使用可忽略未知属性的特性时,异常信息中会有一个 Ignorable 字段,指示该属性是否已经在 @JsonIgnoreProperties 注解中指定为可忽略的属性。