springboot项目中jackson-序列化-处理 NULL教程

在 Spring Boot 项目中使用 Jackson 进行数据序列化和反序列化时,需要先在项目中添加 Jackson依赖。

  1. 安装Jackson依赖

在 Spring Boot 项目中使用 Jackson 进行数据序列化和反序列化时,需要先在项目中添加 Jackson依赖。

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>${jackson.version}</version>
</dependency>

其中${jackson.version}是指定的Jackson版本号

  1. 处理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": [
    ""
  ]
}
  1. 示例说明

假设我们有一个用户类,其中包含用户名、密码和年龄三个属性:

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教程

基础教程推荐