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