- 安装Jackson依赖
在 Spring Boot 项目中使用 Jackson 进行数据序列化和反序列化时,需要先在项目中添加 Jackson依赖。
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
其中${jackson.version}是指定的Jackson版本号
- 处理Null值
在应用程序中使用 Jackson 进行数据序列化时,经常需要处理空值。默认情况下,Jackson会忽略对象中的空属性,不将其序列化到 JSON 中。但是,如果需要在 JSON 中保留为空的属性,则需要针对Jackson进行一些配置。
2.1 处理Java对象中的Null值
在序列化 Java 对象时,可以添加以下注释来控制Jackson如何处理空属性:
- @JsonInclude(JsonInclude.Include.NON_NULL):如果属性为Null,则忽略该属性,不将其包含在JSON中。
例如,定义一个用户类,包含用户名、密码和年龄属性:
@JsonInclude(JsonInclude.Include.NON_NULL)
public class User {
private String username;
private String password;
private Integer age;
//...
}
使用ObjectMapper进行序列化时,添加以下配置:
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
String json = objectMapper.writeValueAsString(user);
如果对象中的属性为空,则不包含该属性在JSON中:
{"username":"test","password":"123456"}
2.2 处理Map和List中的Null值
在序列化 Map 和 List 时,可以先将 Map 和 List 中的 Null 值转换为空字符串或者转换成其他的默认值,然后再进行序列化。可以通过添加以下配置来处理:
objectMapper.setSerializationInclusion(JsonInclude.Include.ALWAYS);
这样,在序列化 Map 和 List 时,如果属性为 Null,则会转换为空字符串或者转换成其他默认值。
例如,定义一个用户类,包含一个Map和一个List属性:
public class User {
private Map<String, String> userMap;
private List<String> userList;
//...
}
如果希望将 Map 和 List 中的 Null 值转换为空字符串:
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setSerializationInclusion(JsonInclude.Include.ALWAYS);
objectMapper.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>() {
@Override
public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
gen.writeString("");
}
});
userMap.put("test", null);
userList.add(null);
String json = objectMapper.writeValueAsString(user);
此时,生成的 JSON 中的 map 中的值为""
:
{
"userMap": {
"test": ""
},
"userList": [
""
]
}
- 示例说明
假设我们有一个用户类,其中包含用户名、密码和年龄三个属性:
public class User {
private String username;
private String password;
private Integer age;
public User(String username, String password, Integer age) {
this.username = username;
this.password = password;
this.age = age;
}
// getter and setter
}
在序列化时,如果需要忽略为空属性不序列化,则在类上添加注解@JsonInclude,如下所示:
@JsonInclude(JsonInclude.Include.NON_NULL)
public class User {
//...
}
在反序列化时,如果JSON中包含空属性,则需要添加一个无参数构造函数:
public User() {}
序列化示例程序:
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
User user = new User("abcd", null, 20);
String json = objectMapper.writeValueAsString(user);
System.out.println(json);
输出结果:
{"username":"abcd","age":20}
反序列化示例程序:
ObjectMapper objectMapper = new ObjectMapper();
String json = "{\"username\":\"abcd\",\"age\":20}";
User user = objectMapper.readValue(json, User.class);
System.out.println(user.toString());
输出结果:
User{username='abcd', password='null', age=20}
在反序列化时,指定了空属性的默认值为 Null。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:springboot项目中jackson-序列化-处理 NULL教程 - Python技术站