FastJson整形資料反序列化的坑

FeelTouch發表於2019-04-19

在開發過程中,遇到了一個json資料反序列化的坑,具體程式碼如下:

1 String viewValue = "..............."; #這裡是json字串
2 JSONObject viewObject = JSONObject.parseObject(viewValue);
3 JSONObject videoObject = (JSONObject) viewObject.get("video");
4 Integer viewCount = new Integer(0);
5 if(videoObject.get("viewCount") != null) {
6    viewCount = (Integer) videoObject.get("viewCount"); #有時會報出異常
7 }

這裡的坑就出現在第6行程式碼,我這裡目標是要獲取viewCount的key對應的整形值,經過幾次測試也沒有發現什麼異常。但是當提交給測試被測試同學報出異常了。那麼具體原因是什麼?直白地說,fastjson在將整形的value值反序列化時,會根據值得具體長度生成不同的型別,一旦值超過Integer型的表達範圍就會反序列化成Long; 在Integer以內會反射為Integer。我測試的值都比較按照線上可能的資料範圍來測試的,而測試同學會更多覆蓋一些邊緣情況,於是就反序列化出了Long,但Long是不能強制轉化為Integer的。

那麼該如何處理?需要經過字串,再轉到Long就不會有什麼問題了,程式碼如下:

if(videoObject.get("viewCount") != null) {
    viewCount = Long.valueOf(String.valueOf(videoObject.get("viewCount")));
 }

需要說明的是,我這裡屬於比較新的版本:

       <dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>fastjson</artifactId>
			<version>1.2.47</version>
		</dependency>

參考:https://www.jianshu.com/p/108b57bac10e

相關文章