【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}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了