net.sf.json判断对象属性是否为空

说明:今天写代码发现对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"))

 

posted @ 2022-07-01 15:33  ジ绯色月下ぎ  阅读(450)  评论(0编辑  收藏  举报