fastjson,請注意大小寫

2021-09-19 22:17:13 字數 4391 閱讀 1669

前言:fastjson先生(後稱之為f先生)由阿里巴巴集團榮譽出品,我的記憶中,偉大的阿里巴巴對於程式設計界,能夠稱之為貢獻的也僅此而已,可見我是多麼的孤陋寡聞。我的專案中也用到了f先生,我很器重他,並且他表現一直非常優秀,然而在對接華夏介面的過程中,我對f先生愛之深,責之切。當然原因不能單純的歸咎於f先生,可惡可憐的華夏介面可能才是禍害之源。

經過一天時間的折磨,最終定位到華夏介面對於getter和setter方法書寫上有點「非人類」,請看以下**:

public string getschools() 

public void setschools(string schools)

經f先生路由後結果如下:

student student = new student();

student.setname("lilei");

string schools = new string[1];

schools[0] = new string("21中");

student.setschools(schools);

string json = json.tojsonstring(student);

system.out.println(json);

//

那麼解決之道是什麼,大家都能想得到了。

public string getschools() 

public void setschools(string schools)

student student = new student();

student.setname("lilei");

string schools = new string[1];

schools[0] = new string("21中");

student.setschools(schools);

string json = json.tojsonstring(student);

system.out.println(json);

//

如果你認為你已經得到了答案,那麼請跳過以下內容,不過我認為,如果你跳過了下面章節的閱讀,你將得不償失。

在乙個安靜的傍晚,我乙個人待在辦公室做華夏介面的除錯工作,雖然寂寞了點,但是還是非常開心,介面除錯工作很順利。然而風雲突變,華夏介面施展了一招「天狗吞日」,瞬間我就迷茫了,出現了總結成果中的第一種情況。

時間一分一秒的過去了,我本著從自我原因找起的原則,不斷審視著自己編寫的**,懷疑自己在對陣列物件的賦值上面錯誤了,接著又懷疑自己在傳遞json資料時發生錯誤。。。最終並沒有找到原因。

也許你看了總結成果後,感覺不就是乙個大小寫問題嗎,我怎麼還喋喋不休。然而個人能力的提公升,就是要反覆的總結,而後才能「得道」。

1.懷疑自己的**出錯了

這永遠都是應該的,從前至後,翻看自己的**,看是否存在bug。發生這個資料丟失的問題後,我必須先審核自己的**,看看我在對陣列物件的賦值時是不是有遺漏,然後看看我在使用f先生的時候是不是有問題,再看看我在呼叫華夏介面的時候是不是有問題。

2.盡量不要拆東牆,補西牆

這一點很重要,在證明自己的**沒有問題後,那麼接下來懷疑的物件自然就是阿里巴巴提供的f先生,以及華夏銀行提供的api介面。那麼在這方面,我們經常容易衝動,因為好不容易抓住一下對方的把柄,我們還不樂呵一下。

我也犯錯了!在證明自己的**沒有問題後,我開始懷疑f先生不支援陣列物件的轉換,因為f先生只提供了json.parsearray、json.parseobject兩種方法(可笑我是多麼的片面主義),經驗主義告訴我,之前我們使用了這兩種方法分別對list、object物件進行轉換,是沒有問題的,但是對於華夏介面使用的object 陣列,f先生是不是不支援這種寫法呢?

就如總結成功中所寫的string schools欄位,經過我的第一步測試,發現是支援的,那麼既然支援陣列,又為什麼會丟失物件呢?

我開始懷疑是不是由於資料物件的三層關係,導致f先生無力轉換呢?

message msg = new message();

student student = new student();

student.setname("lilei");

string schools = new string[1];

schools[0] = new string("21中");

student.setschools(schools);

msg.setparamsobject("student", student);

string json = json.tojsonstring(msg);

system.out.println(json);

// }}

非常遺憾的是,我當時在測試這個步驟的時候,使用的是華夏提供的「非人類」的get***和set***方法(不是get***和set***)的物件,導致我並沒有得出

}}

這個結論。

這個時候,同事說他通過jfinal提供的jsonkit(我記得好像是這個)物件可以轉換華夏銀行提供的「非人類」的get***和set***方法的物件,我也飄飄然的認為,這必須是f先生的乙個bug(當時我還和同事一起嘲笑了阿里巴巴也不咋地,呵呵),於是乎,他提出了使用jackjson來替換fastjson的想法,並且實現了轉換方法。

事情進展的似乎很順利,我把專案中的fastjson拋棄了,換成了jackjson的兩個jar包,並改換了對應的轉換方法。

「月有陰晴圓缺」,等我草草的把重新打包後的jar包放到伺服器上後,出現了乙個驚人的錯誤,jackjson在把乙個包含list的物件read為json的時候出現了錯誤(錯誤現在不記得了,等待周一的時候,我把錯誤補上),並且經歷了很長時間,我和同事都沒有能找到原因。已經快要下班了,由於要快速的實現華夏介面的對接,我決定不能再在這個問題上花費時間了,於是乎,我決定用我的方法解決問題。

message msg = new message();

student student = new student();

student.setname("lilei");

school schools = new school[1];

schools[0] = new school();

schools[0].setname("21中");

// student.setschools(schools);

msg.setparamsobject("student", student);

msg.setparamsobject("list", arrays.aslist(schools));

string json = json.tojsonstring(msg);

system.out.println(json);

// ],"student":}}

// 注意,由於student物件中的setschools的緣故,我需要在message物件中加入list引數,專門傳遞school陣列

message s = json.parseobject(json, message.class);

student ss = json.parseobject(s.getparamsobject("student").tostring(), student.class);

listlist = json.parsearray(s.getparamsobject("list").tostring(), school.class);

ss.setschools(list.toarray(new school[list.size()]));

system.out.println(ss.getschools()[0].getname());

// 21中

這種方式也是被華夏介面

逼迫的。

3.翻看原始碼

顯然,按照2中的方式解決了問題之後,一切就結束了嗎?顯然沒有,如果你還記得總結中說的原因,那麼接下來的工作就是找出原因。很巧合,在實際的開發過程中,我整理**的時候,突然發現華夏介面在進行子賬號簽約工作時,也傳遞了陣列物件,並且經過f先生轉換後,資料時完全存在的,而為什麼華夏介面的清算介面在轉換過程中丟失呢?

幸好幸好,華夏介面api提供的jar包可以反編譯。經過分析,我堅定的認為,問題就發生在華夏介面提供的類中,直接告訴我,肯定是陣列物件的getter和setter方法寫的有問題,經過同事的檢視,的確,清算介面中使用了小寫的getter和setter方法(再次強調,非人類,已經無力吐槽),而子賬號簽約卻使用的大寫寫法(qnmd)。

翻看原始碼無疑是解決問題的殺手鐗

mysql 區分大小寫 大小寫敏感 配置

linux下mysql預設區分大小寫 windows下mysql預設不區分大小寫 檢視是否區分大小寫 lower case table names引數詳解 lower case table names 0 其中 0 區分大小寫,1 不區分大小寫 mysql在linux下資料庫名 表名 列名 別名大小...

大小寫轉換

小寫數值轉大寫 xieshuxu 傳入轉換字串 傳入整數單位 如 元 傳入小數點後一位單位 如 角 傳入小數點後兩位單位 如 分 public string xiaotoda string xiao,string one,string two,string tree if xiao.indexof ...

區分大小寫

這個規則會與以下各個元素匹配 這些元素不能在同乙個文件中同時出現,因為它們都有相同的 id 值 id mostimportant this is important 親自試一試 請注意,類選擇器和 id 選擇器可能是區分大小寫的。這取決於文件的語言。html 和 xhtml 將類和 id 值定義為區...