使用Hutool-json工具包中的JSONUtil.toJsonStr()方法序列化,对象数据中值为null的属性被过滤的问题

本文介绍了在SpringBoot项目中遇到的问题,即使用Hutool的JSONUtil.toJsonStr()方法序列化对象时,空值属性被自动过滤。为了解决这个问题,文章提出了修改JSONUtil的使用方式,将序列化方法改为JSONUtil.toJsonStr(JSONUtil.parseObj(tmp,false)),这样可以保留空值属性。修改后的代码和测试结果表明,现在接口返回的数据包括了所有属性,无论其值是否为空。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:

springboot项目中,编写了一个请求单条记录的接口,接口返回的数据进行了包装,这里用到了Hutool-json。
通过swagger测试接口,发现返回的结果里,对象数据中值为空的属性都被过滤掉了。对于前端和客户端接收使用稍有影响。

需求:

即使值为空的属性也要返回。

解决方案:

将 JSONUtil.toJsonStr(tmp); 改成 JSONUtil.toJsonStr(JSONUtil.parseObj(tmp, false));

1. 统一返回包装类部分代码(修改前)

import cn.hutool.json.JSONUtil;
import lombok.Data;

@Data
public class JsonView {

    private Integer errcode = 0; // 错误代码 0-成功
    private String message; // 消息
    private Object data; // 数据

    public static String render(Integer errcode, String message, Object data) {
        JsonView tmp = new JsonView(errcode, message, data);
        return JSONUtil.toJsonStr(tmp);
    }

    public JsonView(Integer errcode, String message, Object data) {
        this.errcode = errcode;
        this.message = message;
        this.data = data;
    }

}

2. 测试请求的返回结果(修改前)

在这里插入图片描述

3. 修改统一返回包装类中的序列化代码

render()方法的返回改成 JSONUtil.toJsonStr(JSONUtil.parseObj(tmp, false));

因为使用JSONUtil.toJsonStr()方法序列化对象,默认会将对象中值为空的属性过滤掉。Hutool-json中提供了JSONUtil.parseObj()方法,接收两个参数:

/**
* obj: 需要序列化的对象
* ignoreNullValue: 是否忽略对象数据中值为空的属性,默认为true
*/
public static JSONObject parseObj(Object obj, boolean ignoreNullValue) {
    return new JSONObject(obj, ignoreNullValue);
}

4. 测试请求的返回结果(修改后)

在这里插入图片描述

### 回答1: 是的,如果传入的对象null,那么使用JSONUtil.toJsonStr方法就会抛出一个NullPointerException异常。因为此方法内部会尝试对传入的对象进行操作,如果对象null,就会导致空指针异常。 建议在使用JSONUtil.toJsonStr方法之前先判断传入的对象是否为null,如果是null,就不要调用此方法,或者在调用时捕获此异常进行处理。 ### 回答2: JSONUtil.toJsonStr(userInfoVO)括号里面的对象如果是null,不会报错。JSONUtil.toJsonStr方法在处理传入的对象时,会先判断对象是否为null。如果对象null,它会返回null而不是报错。这意味着当userInfoVO为null时,JSONUtil.toJsonStr(userInfoVO)的返回值将是nullJSONUtil是一个常用的工具类库,用于处理JSON格式的数据。它提供了一系列方法,可以将java对象转换为JSON字符串。当传入的对象null时,JSONUtil会正确处理,并返回null,而不会引发异常或报错。这是因为在处理null对象时,JSONUtil会直接返回null,不需要进行其他操作。 如果我们想要避免返回null,可以在调用JSONUtil.toJsonStr方法时,先判断userInfoVO是否为null。如果userInfoVO为null,可以设置一个默认对象或进行其他处理,以确保返回一个有效的JSON字符串。 总之,JSONUtil.toJsonStr(userInfoVO)括号里面的对象如果是null,不会导致报错,方法会返回null。 ### 回答3: 在大多数JSON工具库中,当传入的对象null时,调用JSONUtil.toJsonStr(userInfoVO)会抛出NullPointerException。这是因为在将对象转换为JSON字符串时,需要依赖对象属性进行序列化操作。当对象null时,没有属性可供序列化,因此无法生成有效的JSON字符串。 为了避免报错,我们可以在调用JSONUtil.toJsonStr(userInfoVO)前做空指针判断,例如: ```java String jsonStr; if (userInfoVO == null) { jsonStr = "{}"; // 或者使用其他合法的空JSON对象表示方式 } else { jsonStr = JSONUtil.toJsonStr(userInfoVO); } ``` 这样做的目的是保证即使传入的对象null也不会导致报错,而是生成一个空的JSON对象作为结果返回。这样的处理方式可以根据具体需求进行调整,比如使用空的JSON数组表示等。 需要注意的是,不同的JSON工具库对于传入null对象处理的方式可能会有所不同,所以在实际使用中,要根据具体的JSON工具库文档来确定对null对象的处理方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kyrielx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值