天天看點

FastJson 我大意了,我沒有閃

前言

我沒有閃

正文

最近在做項目,在對象判空的時候,根據業務需求,寫了個自動判空的方法 isEmpty()。

代碼示例:

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;
import lombok.Data;
import lombok.experimental.Accessors;

/**
 * @Author: JCccc
 * @Description:
 * @Date: 2020/11/23 10:13
 */
@Data
@Accessors(chain = true)
public class Programmer {

    private Integer id;
    private String name;
    private Integer age;
    private String jobNum;
    private String imgUrl;
    private String cardId;
    private String phone;

    public boolean isEmpty() {
        return null == this.jobNum;
    }


}      

這一切都看似正常,但是在寫完業務邏輯後,自測地時候發現傳回json格式資料時,多了個字段 empty。

直覺告訴我,這個empty肯定跟我自己寫的判空方法有關。但是一下子還不知道為啥。

FastJson 我大意了,我沒有閃

問題複現,就是轉成JSON資料傳回時,發現一個key 為 empty ,值為false  :

代碼示例:

public static void main(String[] args) {
        Programmer programmer=new Programmer();
        programmer.setId(1);
        programmer.setName("JCccc");
        programmer.setAge(12);
        programmer.setJobNum("10010");
        programmer.setImgUrl(null);
        programmer.setCardId("xxxxxxxxxxxxx");
        programmer.setPhone("136xxxxxxxx");
        


        JSONObject jsonObject= (JSONObject) JSON.toJSON(programmer);
        System.out.println(jsonObject.toJSONString());
    }      

 輸出結果:

FastJson 我大意了,我沒有閃

這個 empty 怎麼出現的呢 ?

一下子有點蒙圈,但是咱們也是武林中人,走一波正常排查流程。

1.根據直覺,肯定跟這個方法有關。

于是乎,我索性把方法注釋掉,測試,發現empty字段消失了。

問題鎖定,就是這個方法。

2.那麼根據方法的編譯時規則,辨識方法的身份特征,是 方法名 和 參數。

而我寫的判空方法,是沒有傳遞參數的,是以,進一步确定, 方法名問題。

于是乎我把方法名随便改了個名字,testA(),果然一測試,發現empty字段消失了。

這一下子,思路清晰了,好像想到了一些東西,沒錯,就是阿裡巴巴的開發手冊好像有這麼一個注意項,如圖:

FastJson 我大意了,我沒有閃

沒錯,正是因為這個is開頭的命名導緻的!!!

通過debug也是可以看到的,有興趣的可以debug直接看這個方法:

第一個debug點:

FastJson 我大意了,我沒有閃

第二個debug點:

FastJson 我大意了,我沒有閃

第三個debug點:

FastJson 我大意了,我沒有閃

第四個debug點:(其實到了這裡,針對方法的話,fastJson還是給了機會的,隻需要使用@JSONField(serialize=false) 注解就好了)

FastJson 我大意了,我沒有閃

好吧,就先這樣吧。

我已經改成verifyEmpty()了,畢竟都是前人踩坑總結出來的,就注意好了。

(本人已測試,不止fastjson,還有其他序列化如果使用is開頭的變量,也會有影響。 )