【Jackson】- 忽略未知的JSON属性

Jackson忽略未知的JSON属性

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

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

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实体中。

posted @ 2023-01-30 16:52  明小子@  阅读(7)  评论(0)    收藏  举报