当我们调用 JSONObject.toJSONString(obj) 方法时,如果 obj 对象中存在 null 值的属性,那么转换成 JSON 字符串时就会出现问题,最终输出 null 值或抛出异常。下面我们来详细讲解如何解决此问题,以下是完整攻略:
当我们调用 JSONObject.toJSONString(obj) 方法时,如果 obj 对象中存在 null 值的属性,那么转换成 JSON 字符串时就会出现问题,最终输出 null 值或抛出异常。下面我们来详细讲解如何解决此问题,以下是完整攻略:
1. 基本原因
在 JSONObject.toJSONString() 方法中,会检查对象 obj 是否为 null,如果是 null,则直接返回 "null" 字符串。当对象 obj 中存在 null 值的属性时,转换成 JSON 字符串时就会出现问题。
2. 解决方法
2.1 使用JSONAware接口
JSONAware 接口中提供了 toJSONString() 方法,可以自定义转换成 JSON 字符串的规则。我们可以自定义一个实现了 JSONAware 接口的类,在实现 toJSONString() 方法时,对 null 值的属性进行处理,避免输出 "null" 字符串。
示例代码如下:
import com.alibaba.fastjson.JSONAware;
import com.alibaba.fastjson.JSONObject;
public class MyObject implements JSONAware {
private String name;
private Integer age;
private String desc;
// 省略getter和setter方法
@Override
public String toJSONString() {
JSONObject jsonObj = new JSONObject();
if (name != null) {
jsonObj.put("name", name);
}
if (age != null) {
jsonObj.put("age", age);
}
if (desc != null) {
jsonObj.put("desc", desc);
}
return jsonObj.toJSONString();
}
}
当 obj 对象为 MyObject 类型时,我们可以调用 JSONObject.toJSONString(obj) 方法将其转换成 JSON 字符串,避免了输出 "null" 字符串的问题。
2.2 使用SerializerFeature.PrettyFormat
SerializerFeature.PrettyFormat 可以格式化 JSON 字符串,并对 null 值的属性进行处理,将其转换成空串输出,而非 "null" 字符串。
示例代码如下:
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
public class Main {
public static void main(String[] args) {
JSONObject obj = new JSONObject();
obj.put("name", "Tom");
obj.put("age", null);
obj.put("desc", "This is a description.");
// 格式化JSON字符串,并对null值的属性进行处理
String jsonString = JSON.toJSONString(obj, SerializerFeature.PrettyFormat,
SerializerFeature.WriteNullStringAsEmpty);
System.out.println(jsonString);
}
}
输出结果如下:
{
"desc": "This is a description.",
"name": "Tom",
"age": ""
}
3.总结
以上就是解决 JSONObject.toJSONString() 输出 null 的问题的两种方法,一种是自定义实现 JSONAware 接口,另一种是使用 SerializerFeature.PrettyFormat。这些方法适用于 fastjson 1.2.15 及以上版本。
本文标题为:解决JSONObject.toJSONString()输出null的问题
- 一文带你了解Spring中@Enable开头注解的使用 2023-05-19
- 一文搞懂Java项目中枚举的定义与使用 2023-01-12
- Java开源项目用法介绍 2023-10-08
- java – 基于JDBC的HSQLDB:批量执行SQL语句 2023-11-02
- Minio与SpringBoot使用okhttp3问题解决 2023-06-11
- SpringMVC实现获取请求参数方法详解 2023-06-02
- Java中获取当前路径的几种方法总结 2023-12-28
- java实现后台返回base64图形编码 2023-01-08
- java servlet获得客户端相关信息的简单代码 2024-01-28
- Java解决代码重复的三个绝招分享 2023-03-06