使用fastjson踩的坑(下劃線和大小寫)

項(xiàng)目和第三方對接牺蹄,有接口一直調(diào)不通。直到我拿到合作方的入?yún)⒑蟊〕幔瑔栴}來了沙兰,有了接下來的一系列故事氓奈。
拿到原生的第三方參數(shù)(JSON格式的),為了節(jié)省時間鼎天,迫不及待地直接在本地單元測試一波舀奶。熟悉的操作,這里為了方便觀察斋射,我模擬一次請求從controller進(jìn)入的請求:

import com.alibaba.fastjson.JSON;
import lombok.Data;

public class ProFastjson {
    @Data
    static class Teacher {
        private String teacherName;
    }

    private static TeacherController teacherController = new TeacherController();

    public static void main(String[] args) {
        String str = "{\"teacher_name\":\"zxerjones\"}";
        Teacher teacher = JSON.parseObject(str, Teacher.class);
        teacherController.search(teacher);
    }
}

看重點(diǎn):我的JSONString參數(shù)名有下劃線育勺,Teacher的是沒有teacher_name這個屬性的,反序列化之后的值應(yīng)該是空的罗岖,可偏偏方法走通了涧至。不甘心的我決定debug一波,如下圖:

反序列化結(jié)果

反序列化成功了桑包,是不是一臉懵逼南蓬。沒錯FASTJson就是不和你講道理。
行吧捡多,那一定是是FASTJson內(nèi)部的反序列化機(jī)制造成這樣的結(jié)果蓖康,debug進(jìn)源碼看看:

JSON.parseObject方法內(nèi)部

注意看上圖378行,JSON的反序列化就是在這個方法中實(shí)現(xiàn)的垒手,繼續(xù)跟進(jìn):


DefaultJSONParser.parseObject方法內(nèi)部

上圖對一些規(guī)則進(jìn)行校驗(yàn)之后,開始進(jìn)入主題倒信。正式調(diào)用反序列化工具JavaBeanDeserializer.deserialze對字符進(jìn)行反序列化科贬。這個方法主要做的事情就是對JSON字符串內(nèi)部的鍵值對和我們需要的反序列化結(jié)果類進(jìn)行綁定,賦值(這個方法代碼比較多鳖悠,只貼重點(diǎn)):下圖是賦值的過程榜掌,這才是導(dǎo)致問題的關(guān)鍵:


JavaBeanDeserializer.deserialze方法內(nèi)部
就是850行代碼,終于找到問題的所在了乘综,馬上就真相大白≡髡耍現(xiàn)在可以確定就是parseField方法搞的鬼,繼續(xù)點(diǎn)進(jìn)去:

parseField方法內(nèi)部

上圖方法內(nèi)部做的事情就是生成field反序列化工具對field反序列化卡辰,然后賦值胞皱。這個field反序列化工具從何而來斷點(diǎn)打到1089行,可以看到九妈,這個方法返回了我們需要的工具反砌,點(diǎn)進(jìn)去:


JavaBeanDeserializer.smartMatch方法內(nèi)部

代碼做的事情就是根據(jù)JSON字符串的鍵(teacher_name)做一次hash運(yùn)算,然后與需要反序列化結(jié)果(Teacher.class)中的所有參數(shù)(這里只有teacherName)做hash運(yùn)算萌朱,根據(jù)生成的hash值來對field進(jìn)行配對宴树。OK就是這樣的,現(xiàn)在我們已經(jīng)找到問題的根源晶疼,hash之后的值是相同的酒贬。fastjosn內(nèi)部封裝了計(jì)算hash的工具類又憨,TypeUtils.fnv1a_64_lower,如下圖:
TypeUtils.fnv1a_64_lower
代碼中可以看到進(jìn)行hash的兩個規(guī)則:
  1. ‘-’和‘_’不參與hash運(yùn)算锭吨;
  2. 忽略大小寫蠢莺。

根據(jù)最后得出的hash規(guī)則,那么可以在json字符串中隨意的添加"_","-",并且大小寫忽略都可以反序列化成功耐齐。證實(shí)下猜想:如下代碼

    public static void main(String[] args) {
        String str = "{\"TEACHER___---NAME\":\"zxerjones\"}";
        Teacher teacher = JSON.parseObject(str, Teacher.class);
        System.out.println(teacher);
    }

運(yùn)行結(jié)果:


ProFastjson.Teacher(teacherName=zxerjones)

Process finished with exit code 0

猜想成立浪秘,問題解決。血一樣的教訓(xùn):能用postman就不要用單元測試埠况。~~(╯﹏╰)~~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末耸携,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子辕翰,更是在濱河造成了極大的恐慌夺衍,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件喜命,死亡現(xiàn)場離奇詭異沟沙,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)壁榕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進(jìn)店門矛紫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人牌里,你說我怎么就攤上這事颊咬。” “怎么了牡辽?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵喳篇,是天一觀的道長。 經(jīng)常有香客問我态辛,道長麸澜,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任奏黑,我火速辦了婚禮炊邦,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘攀涵。我一直安慰自己铣耘,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布以故。 她就那樣靜靜地躺著蜗细,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上炉媒,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天踪区,我揣著相機(jī)與錄音,去河邊找鬼吊骤。 笑死缎岗,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的白粉。 我是一名探鬼主播传泊,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼鸭巴!你這毒婦竟也來了眷细?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤鹃祖,失蹤者是張志新(化名)和其女友劉穎溪椎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體恬口,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡校读,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了祖能。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片歉秫。...
    茶點(diǎn)故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖养铸,靈堂內(nèi)的尸體忽然破棺而出端考,到底是詐尸還是另有隱情,我是刑警寧澤揭厚,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站扶供,受9級特大地震影響筛圆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜椿浓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一太援、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧扳碍,春花似錦提岔、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春赛惩,著一層夾襖步出監(jiān)牢的瞬間哀墓,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工喷兼, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留篮绰,地道東北人。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓季惯,卻偏偏與公主長得像吠各,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子勉抓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 你有體驗(yàn)過贾漏,當(dāng)你愛上一件事情,全情投入時的專注琳状、沉浸其中的如癡如醉磕瓷,讓你可以忘記一切的感覺嗎? 比如識食物為俊杰的...
    慕七七_(dá)閱讀 539評論 0 3
  • 不知道你們是否有過這樣的情況硕盹? 總在說,自己想要實(shí)現(xiàn)什么目標(biāo)叨咖,但卻總發(fā)現(xiàn)時間太少瘩例。今天要開會,明天要聚會甸各,好像每天...
    其牙閱讀 542評論 0 0
  • 下午伏案累了垛贤,看陽光燦爛,想出去走走趣倾,休息一下聘惦。昨日沿著通呂運(yùn)河,從二號橋到靜海大橋儒恋,再到北大橋走了個來回善绎。想換個...
    湄之閱讀 342評論 1 0
  • 今早像往常一樣禀酱,踏著一層厚厚的“云”,行走在路上牧嫉。冬天的天氣就是這般剂跟,冷的不禁打顫,街道上來來往往找活兒的...
    瑭鈺筱閱讀 1,155評論 3 2