当我们调用 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的问题


基础教程推荐
- Java实现替换Word中文本和图片功能 2022-12-02
- java基于RMI远程过程调用详解 2023-04-11
- Java Web开发中过滤器和监听器使用详解 2023-06-30
- 详解java中的PropertyChangeSupport与PropertyChangeListener 2024-01-18
- swagger配置正式环境中不可访问的问题 2023-01-02
- 基于Spring5实现登录注册功能 2023-05-13
- SpringBoot整合Web之CORS支持与配置类和 XML配置及注册拦截器 2023-04-12
- 制作一个假的javax.sql.DataSource? 2023-11-02
- 匹配form表单中所有内容的正则表达式 2023-12-22
- Java Swagger使用教程 2023-03-11