美文网首页Jackson学习笔记
Jackson忽略未知的JSON属性

Jackson忽略未知的JSON属性

作者: 攻城狮susht | 来源:发表于2020-05-05 00:21 被阅读0次

在本文中,我们将学习如何使用Jackson ,将JSON解析为Java 对象时忽略未知的JSON属性

要了解更多关于Jackson的用法,请移步Jackson系列文章

若第一时间获取相关知识,请关注公众号:susht

1.解析带有未知字段的JSON字符串

1.1. 默认Jackson未知属性

默认情况下,如果Java类不包含与所有JSON属性相对应的所有字段,Jackson API将引发异常。

例如,我们有以下JSON对象:

{
  "name": "John Doe",
  "email": "john.doe@example.com",
  "admin": true,
  "age": 32
}

现在,我们想将上述JSON对象反序列化为以下Java类User

public class User {
    private String name;
    private String email;
    private boolean admin;

    public User() {
    }

    public User(String name, String email, boolean admin) {
        this.name = name;
        this.email = email;
        this.admin = admin;
    }
    //省略 getters and setters, toString() 
   
}

如上所示,User类不包含与ageJSON属性匹配的任何字段。解析上述JSON 将导UnrecognizedPropertyException异常:

@Test //默认Jackson未知属性行为
public final void defaultJsonToObject() throws JsonProcessingException {

    String jsonString = "{\"name\":\"John Doe\",\"email\":\"john.doe@example.com\"," +
            "\"admin\":true,\"age\":32}";

    ObjectMapper mapper=new ObjectMapper();

    User user=mapper.readValue(jsonString,User.class);

    System.out.println(user);
}

上面的代码运行失败,并抛出以下异常:

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "age" (class com.baeldung.jackson.unknownproperties.User), not marked as ignorable (3 known properties: "name", "email", "admin"])

1.2. 类级别忽略未知的JSON属性

要忽略单个类的所有未知属性,只需在类的顶部声明@JsonIgnoreProperties注释即可,如下所示:

@JsonIgnoreProperties(ignoreUnknown = true)
public class User {
    // ...
}

再次执行上面的代码,您将看到以下输出

User{name='John Doe', email='john.doe@example.com', admin=true}

1.3. 全局忽略未知的JSON属性

解析JSON时处理未知属性的另一种方法是配置ObjectMapper类,使其在遇到未知的属性时不会反序列化失败:

@Test //默认Jackson未知属性行为
public final void configJsonToObject() throws JsonProcessingException {

    String jsonString = "{\"name\":\"John Doe\",\"email\":\"john.doe@example.com\"," +
            "\"admin\":true,\"age\":32}";

    ObjectMapper mapper=new ObjectMapper();

    // 配置忽略未知属性
    mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

    User user=mapper.readValue(jsonString,User.class);

    System.out.println(user);
}

再次执行上面的代码,您将看到以下输出

User{name='John Doe', email='john.doe@example.com', admin=true}

2.解析不完整的JSON

与其他未知字段类似,解析不完整的JSON(不包含Java类中所有字段的JSON)对于Jackson来说也不是问题:

    @Test
    public final void incompleteJsonToObject() throws JsonProcessingException {

        String jsonString = "{\"name\":\"John Doe\"}";

        ObjectMapper mapper=new ObjectMapper();
        
        User user=mapper.readValue(jsonString,User.class);

        System.out.println(user);
    }

输出结果

User{name='John Doe', email='null', admin=false}

3. 结论

本文介绍了如何使用Jackson反序列化一个带有未知属性的JSON。这是在使用Jackson时最常见的配置之一,因为我们经常需要将外部REST API的JSON结果映射到java实体中。

相关文章

网友评论

    本文标题:Jackson忽略未知的JSON属性

    本文链接:https://www.haomeiwen.com/subject/wyfpghtx.html