使用Jackson忽略特定字段的序列化
当默认的Jackson行为不足以满足需求,且我们需要精确控制哪些属性应该被序列化为JSON时,可以采用几种方法来忽略不需要的字段。
添加依赖项
首先,在pom.xml
中添加以下依赖项:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>LATEST_VERSION</version> <!-- 请替换为Maven中央仓库上的最新版本 -->
</dependency>
这个依赖会自动引入jackson-core
和jackson-annotations
。
忽略字段的方法
Jackson提供了多种方式来忽略字段:
- 类级别忽略字段:通过
@JsonIgnoreProperties
注解。 - 字段级别忽略字段:通过
@JsonIgnore
注解直接应用于字段或getter方法。 - 忽略特定类型的全部字段:通过
@JsonIgnoreType
注解。
示例代码
接下来,我们将展示每种方法的使用示例。
1. 类级别忽略字段
package net.javaguides.jackson.ignore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
@JsonIgnoreProperties({"id", "firstName"})
public class CustomerDTO {
private final String id;
private final String firstName;
private final String lastName;
public CustomerDTO(String id, String firstName, String lastName) {
this.id = id;
this.firstName = firstName;
this.lastName = lastName;
}
// Getters...
}
测试输出将只包含lastName
字段。
2. 字段级别忽略字段
package net.javaguides.jackson.ignore;
import com.fasterxml.jackson.annotation.JsonIgnore;
public class CustomerDTO {
@JsonIgnore private final String id;
@JsonIgnore private final String firstName;
private final String lastName;
public CustomerDTO(String id, String firstName, String lastName) {
this.id = id;
this.firstName = firstName;
this.lastName = lastName;
}
// Getters...
}
同样,测试输出将只包含lastName
字段。
3. 忽略特定类型的全部字段
如果我们想要忽略特定类型的所有字段,可以使用@JsonIgnoreType
注解:
package net.javaguides.jackson.ignore;
import com.fasterxml.jackson.annotation.JsonIgnoreType;
public class UserDTO {
public int id;
public Name name;
public UserDTO(int id, Name name) {
this.id = id;
this.name = name;
}
@JsonIgnoreType
public static class Name {
public String firstName;
public String lastName;
public Name(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
}
}
测试此配置的主程序将仅显示id
字段,而忽略Name
类的所有字段。
测试代码
为了测试上述配置,可以使用如下测试代码:
package net.javaguides.jackson.ignore;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
public class IgnoreFieldTest {
public static void main(String[] args) throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
// Test for CustomerDTO with ignored fields
CustomerDTO customer = new CustomerDTO("CUST100", "Tony", "Stark");
System.out.println(mapper.writeValueAsString(customer));
// Test for UserDTO with ignored type
UserDTO.Name name = new UserDTO.Name("John", "Doe");
UserDTO user = new UserDTO(1, name);
System.out.println(mapper.writeValueAsString(user));
}
}
这将分别输出:
{"lastName":"Stark"}
{"id":1}
注意:我们已经在每个示例中忽略了指定的字段,并且这些字段不会出现在最终的JSON输出中。