【Jackson】 - 忽略字段

Jackson忽略字段

1.概述

本文将展示如何使用Jackson 将对象序列化为JSON时忽略某些字段。
将对象转换为json时,对象的属性以及set、get方法在某些情况下无法修改,而且默认的字段不符合json字段的要求,我们还需要精确地控制哪些内容被序列化为JSON,这些问题Jackson 都能很好的帮我们处理。

2.类级别注释忽略字段

我们可以使用类级别注释@JsonIgnoreProperties来忽略特定字段,在注释的value中指定要忽略的字段:

@JsonIgnoreProperties(value = { "age" })  
public class UserIgnoreFieldByName {  
    private String name;  
    private int age;  
    private boolean admin;  
  
    public UserIgnoreFieldByName() {  
    }  
  
    // 省略 setters , getters   
}  

测试代码如下:

@Test  
public void fieldIsIgnoredByName() throws IOException {  
    ObjectMapper mapper = new ObjectMapper();  
    UserIgnoreFieldByName object = new UserIgnoreFieldByName();  
    object.setAdmin(true);  
    String jsonString = mapper.writeValueAsString(object);  
    System.out.println(jsonString);  
}  
//输出结果:{"name":null,"admin":true}  

3.字段级别注释忽略字段

我们可以直接在要忽略的字段上使用@ JsonIgnore注释来忽略此字段:

public class UserIgnoreField {  
  
    private String name;  
    @JsonIgnore  
    private int age;  
    private boolean admin;  
    public UserIgnoreField() {  
  
    }  
   // 省略 setters , getters   
}  

编写测试用例测试_age_字段确实不在输出的JSON字符串中:

@Test  
public void fieldIsIgnoredDirectlyt() throws IOException {  
    ObjectMapper mapper = new ObjectMapper();  
    UserIgnoreField object = new UserIgnoreField();  
  
    String jsonString = mapper.writeValueAsString(object);  
    System.out.println(jsonString);  
}  
//输出结果:{"name":null,"admin":false}  

4.按类型忽略所有字段

我们可以使用@ JsonIgnoreType注解忽略指定类型的所有字段。如果此类型在我们的空值范围之内,我们可以直接在该类上添加@JsonIgnoreType注释:

@JsonIgnoreType  
public class Name {  
    public String firstName;  
    public String lastName;  
    public Name(String firstName, String lastName) {  
        super();  
        this.firstName = firstName;  
        this.lastName = lastName;  
    }  
}  
  
public class UserDTO {  
    public int id;  
    public Name name;  
    // 省略 setters , getters   
}  

测试代码如下:

public static void main(String[] args) throws JsonProcessingException {  
    ObjectMapper objectMapper=new ObjectMapper();  
    Name name = new Name("John", "Doe");  
    UserDTO user = new UserDTO(1, name);  
    String result = objectMapper.writeValueAsString(user);  
    System.out.println(result);  
}  
//输出结果:{"id":1}  

但是,我们常常无法控制类本身。在这种情况下,我们可以充分利用Jackson mixins

首先,我们为要忽略的类型定义一个MixIn,并使用_@JsonIgnoreType进行_注释:

@JsonIgnoreType  
public class MyMixInForIgnoreType {}  

然后,注册该mixin来替换(并忽略)所有_String []_类型:

mapper.addMixInAnnotations(String[].class, MyMixInForIgnoreType.class);  

实体类如下:

public class UserWithSpecialField {  
  
    private String[] name;  
    private int age;  
    private boolean admin;  
    private  String[] address;  
  
    public UserWithSpecialField() {  
        super();  
    }  
// 省略 setters , getters   
}  

测试代码如下:

@Test  
public void filterIgnoresFieldByName() throws IOException {  
    ObjectMapper mapper = new ObjectMapper();  
    SimpleBeanPropertyFilter theFilter = SimpleBeanPropertyFilter.serializeAllExcept("age");  
    FilterProvider filters = new SimpleFilterProvider().addFilter("myFilter", theFilter);  
  
    UserWithFilter userWithFilter = new UserWithFilter();  
    userWithFilter.setAge(12);  
  
    String dtoAsString = mapper.writer(filters).writeValueAsString(userWithFilter);  
    System.out.println(dtoAsString);  
}  

注意:从2.5版本开始,我们不能使用这个方法来忽略基本数据类型,但是我们可以使用它来定制数据类型和数组。

5.使用过滤器忽略字段


我们还可以使用过滤器来忽略 Jackson中的特定字段。首先,我们需要在目标Java对象上定义过滤器:

@JsonFilter("myFilter")  
public class UserWithFilter {  
  
    private String name;  
    private int age;  
    private boolean admin;  
  
    public UserWithFilter() {  
        super();  
    }  
 // 省略 setters , getters   
}  

然后,我们定义一个简单的过滤器,该过滤器将忽略_age_字段:

SimpleBeanPropertyFilter theFilter = SimpleBeanPropertyFilter.serializeAllExcept("age");  
FilterProvider filters = new SimpleFilterProvider().addFilter("myFilter", theFilter);  

详细测试代码如下:

@Test  
public void filterIgnoresFieldByName() throws IOException {  
    ObjectMapper mapper = new ObjectMapper();  
    SimpleBeanPropertyFilter theFilter = SimpleBeanPropertyFilter.serializeAllExcept("age");  
    FilterProvider filters = new SimpleFilterProvider().addFilter("myFilter", theFilter);  
  
    UserWithFilter userWithFilter = new UserWithFilter();  
    userWithFilter.setAge(12);  
  
    String dtoAsString = mapper.writer(filters).writeValueAsString(userWithFilter);  
    System.out.println(dtoAsString);  
}  
//输出结果:{"name":null,"admin":false}
posted @   明小子@  阅读(1297)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示