Fastjson解析對(duì)象屬性數(shù)量問題

1. 前言

最近在進(jìn)行測(cè)試的時(shí)候,無意間出現(xiàn)了一個(gè)問題:

java.lang.VerifyError: (class: com/alibaba/fastjson/parser/deserializer/FastjsonASMDeserializer_731_Order, method: deserialze signature: (Lcom/alibaba/fastjson/parser/DefaultJSONParser;Ljava/lang/reflect/Type;Ljava/lang/Object;I)Ljava/lang/Object;) Accessing value from uninitialized register 85 at java.lang.Class.getDeclaredConstructors0(Native Method) at java.lang.Class.privateGetDeclaredConstructors(Class.java:2671) at java.lang.Class.getConstructor0(Class.java:3075) at java.lang.Class.getConstructor(Class.java:1825) at com.alibaba.fastjson.parser.deserializer.ASMDeserializerFactory.createJavaBeanDeserializer(ASMDeserializerFactory.java:82) at com.alibaba.fastjson.parser.ParserConfig.createJavaBeanDeserializer(ParserConfig.java:639) at com.alibaba.fastjson.parser.ParserConfig.getDeserializer(ParserConfig.java:491) at com.alibaba.fastjson.parser.ParserConfig.getDeserializer(ParserConfig.java:348) at com.alibaba.fastjson.parser.DefaultJSONParser.parseObject(DefaultJSONParser.java:639) at com.alibaba.fastjson.JSON.parseObject(JSON.java:350) at com.alibaba.fastjson.JSON.parseObject(JSON.java:254) at com.alibaba.fastjson.JSON.parseObject(JSON.java:467) at com.test.FastjsonTest.testFastjson(FastjsonTest.java:16)

可以看到,是fastjson轉(zhuǎn)換問題,其中Fastjson版本是:1.2.28。

2. 問題排查

首先可以看到,這段代碼是使用fastjson將json字符串轉(zhuǎn)換為Order對(duì)象的:

return JSON.parseObject(getJson(), Order.class);

這段代碼以前的時(shí)候是正常運(yùn)行的,最近唯一的改動(dòng)就是轉(zhuǎn)換的對(duì)象中添加了一個(gè)字段,其他是沒有修改的。

因?yàn)槭窃诜?wù)器上出現(xiàn)的問題,所以先在本地用main方法重現(xiàn)下:

  • 首先想辦法拿到這個(gè)json字符串;
  • 在代碼中創(chuàng)建一個(gè)應(yīng)用程序,在main方法中手動(dòng)將json轉(zhuǎn)換為Order對(duì)象,看一下有沒有報(bào)錯(cuò);
  • 然后將對(duì)象中新添加的該字段給刪除,再跑一下,看是否還報(bào)錯(cuò);如果不報(bào)錯(cuò),說明是該字段的問題;
  • 然后換下字段名稱或類型,再看下是否還報(bào)錯(cuò),如果不報(bào)錯(cuò),說明是該字段類型或名稱的問題;如果還報(bào)錯(cuò),說明不是字段本身有什么問題,而是添加字段導(dǎo)致的問題;

試過后可以看到,該字段本身類型并沒有什么問題,而是加了該字段后出現(xiàn)的問題,然后在網(wǎng)上簡(jiǎn)單搜下,就發(fā)現(xiàn)了:

Fastjson1.2.28版本下,在json反序列化的時(shí)候,當(dāng)字段數(shù)量為32或者64時(shí),會(huì)反序列化報(bào)錯(cuò)。

具體可以看下Fastjson的issue:https://github.com/alibaba/fastjson/issues/1092

基于此,先數(shù)了下Order對(duì)象的數(shù)量,恰好32個(gè);然后本地調(diào)試下,當(dāng)數(shù)量+1或者-1的時(shí)候,都是正確的。

3. 解決方式

解決方式也就很簡(jiǎn)單了:

  • a. 升級(jí)fastjson到1.2.28之后的版本;
  • b. 將字段數(shù)量在32位/64位基礎(chǔ)上加1;

最終采用臨時(shí)方式,添加一個(gè)冗余字段來解決。因?yàn)槭蔷€上的服務(wù),版本不能隨便神升級(jí),如果升級(jí)的話,還要測(cè)試進(jìn)行回歸。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • FastJson是一個(gè)近幾年非常熱門的第三方j(luò)ava庫,它以它強(qiáng)大的功能和出色的性能表現(xiàn)而廣為人知。那么,究竟為何...
    月強(qiáng)閱讀 15,433評(píng)論 0 15
  • mean to add the formatted="false" attribute?.[ 46% 47325/...
    ProZoom閱讀 3,224評(píng)論 0 3
  • JSON的特點(diǎn): 1、JSON比XML的數(shù)據(jù)傳遞的有效性高;2、JSON完全獨(dú)立于編程語言;3、JSON的本質(zhì)是具...
    程序員之路閱讀 3,842評(píng)論 0 3
  • 聽聞阿里的fastJson特別的厲害.就下載了,稍微的試了一下: 本次使用:fastjson-1.2.8.jar ...
    子龍神閱讀 681評(píng)論 0 0
  • 花開正好,春風(fēng)十里。 櫻花爛漫,愿你嫣然。 和風(fēng)習(xí)習(xí),柳絮飄飄。 佳期如夢(mèng),剛好有你。
    姬澤中閱讀 181評(píng)論 0 1

友情鏈接更多精彩內(nèi)容