@JsonInclude(Ininclude.NON_NULL) 不起作用杰克逊序列化空值

js

1个回答

写回答

luuyoio

2025-07-04 22:30

+ 关注

Java
Java

杰克逊是一个广泛应用于Java平台的高性能JSON处理库。在使用杰克逊进行序列化和反序列化时,有时候我们希望排除掉空值(null值)的字段,以减少JSON数据的冗余性。为了实现这个功能,我们可以使用注解@JSonInclude(JSonInclude.Include.NON_NULL)。然而,有时候这个注解可能会失效,导致空值仍然被序列化到JSON中。本文将介绍为什么@JSonInclude(JSonInclude.Include.NON_NULL)可能不起作用的原因,并提供解决方案。

在使用杰克逊进行序列化时,我们通常会定义一个POJO类来表示要序列化的对象。为了排除空值字段,我们可以在类级别或者属性级别使用注解@JSonInclude(JSonInclude.Include.NON_NULL)。例如,我们有一个User类,其中包含了id、name和age属性,我们希望排除掉空值的属性。下面是一个简单的例子:

Java

public class User {

@JSonInclude(JSonInclude.Include.NON_NULL)

private String id;

@JSonInclude(JSonInclude.Include.NON_NULL)

private String name;

@JSonInclude(JSonInclude.Include.NON_NULL)

private Integer age;

// 省略getter和setter方法

}

在上述例子中,我们在id、name和age属性上使用了@JSonInclude(JSonInclude.Include.NON_NULL)注解,表示只有当属性值不为null时才会进行序列化。

然而,有时候我们会发现@JSonInclude(JSonInclude.Include.NON_NULL)注解并没有起到应有的作用,即便属性值为null,仍然会被序列化到JSON中。这个问题的原因是,杰克逊默认会将对象的所有属性都进行序列化,即使属性值为null。为了解决这个问题,我们需要进行一些额外的配置。

## 配置ObjectMapper对象

要解决@JSonInclude(JSonInclude.Include.NON_NULL)不起作用的问题,我们需要对ObjectMapper对象进行配置。ObjectMapper是杰克逊库的核心类,负责将Java对象转换为JSON字符串或者将JSON字符串转换为Java对象。

在配置ObjectMapper对象时,我们需要使用方法setSerializationInclusion()并传入JSonInclude.Include.NON_NULL参数。这样,当ObjectMapper进行序列化时,空值字段将会被排除掉。下面是一个示例:

Java

ObjectMapper objectMapper = new ObjectMapper();

objectMapper.setSerializationInclusion(JSonInclude.Include.NON_NULL);

在上述示例中,我们创建了一个ObjectMapper对象,并使用setSerializationInclusion()方法设置了序列化时的包含规则为JSonInclude.Include.NON_NULL。这样,当我们使用该ObjectMapper对象进行序列化时,空值字段将不会被序列化。

## 案例代码

为了更好地理解上述的解决方案,以下是一个完整的示例代码:

Java

import com.fasterXML.jackson.annotation.JSonInclude;

import com.fasterXML.jackson.databind.ObjectMapper;

public class MAIn {

public static void mAIn(String[] args) throws Exception {

User user = new User();

user.setId(null);

user.setName("John");

user.setAge(null);

ObjectMapper objectMapper = new ObjectMapper();

objectMapper.setSerializationInclusion(JSonInclude.Include.NON_NULL);

String JSonString = objectMapper.writeValueAsString(user);

System.out.println(JSonString);

}

}

class User {

@JSonInclude(JSonInclude.Include.NON_NULL)

private String id;

@JSonInclude(JSonInclude.Include.NON_NULL)

private String name;

@JSonInclude(JSonInclude.Include.NON_NULL)

private Integer age;

// 省略getter和setter方法

}

在上述示例中,我们创建了一个User对象,并设置了id和age属性为null,name属性为"John"。然后,我们使用ObjectMapper对象将User对象序列化为JSON字符串,并打印输出。由于我们在ObjectMapper对象上设置了@JSonInclude(JSonInclude.Include.NON_NULL),JSON字符串中将不会包含空值字段。

通过以上的解决方案,我们可以轻松地排除掉空值字段,使得生成的JSON数据更加紧凑和规范。杰克逊库的灵活性和强大的功能使得我们能够更好地处理和操作JSON数据,为Java开发提供了便利。

举报有用(4)分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号