说明:今天写代码发现对net.sf.json.JSONObject取值后判断是否为null,死活进不去,打印了获取属性后的值,发现是一个被封装为JSONNull对象
import net.sf.json.JSONNull; import net.sf.json.JSONObject; import java.util.HashMap; import java.util.Map; public class Test { public static void main(String[] args) { Map<String, Object> m = new HashMap<>(); m.put("aa", null); JSONObject json = JSONObject.fromObject(m); Object o = json.get("aa"); System.out.println(o.getClass()); System.out.println(null == json.get("aa")); System.out.println(JSONNull.getInstance().equals(json.get("aa")));
System.out.println(o instanceof JSONNull) } }
对应的打印
class net.sf.json.JSONNull false true
点进去看JSONNull源码如下
// // Source code recreated from a .class file by IntelliJ IDEA // (powered by Fernflower decompiler) // package net.sf.json; import java.io.IOException; import java.io.Writer; public final class JSONNull implements JSON { private static JSONNull instance = new JSONNull(); //默认是一个JSONNull的实例 instance public static JSONNull getInstance() { return instance; } private JSONNull() { } //可以传null来进行判断 public boolean equals(Object object) { return object == null || object == this || object == instance || object instanceof JSONObject && ((JSONObject)object).isNullObject() || "null".equals(object); } //这个也可以,但是会抛异常,业务代码中,这种肯定是不想要被抛出的 public boolean isEmpty() { throw new JSONException("Object is null"); } //这个也可以,抛异常对业务代码不太友好 public int size() { throw new JSONException("Object is null"); } //这个可间接判断 public String toString() { return "null"; } //··· }
可用的判断属性是否为空的方法,建议使用重写的equals方法,因为JSONNull没有提供有参的构造方法,创造instance,进而进行调用toString、size、isEmpty等方法,也真是够垃圾的,我找了一
圈,在net.sf.json.JSONObject 中找到了几处JSONNull的使用,用的都是toString方法或者equal方法
//判断属性aa的值是否是null JSONNull.getInstance().equals(json.get("aa"))