fastjson處理json字符串爲對象的類型問題

先說結論

json字符串的話,對於使用fastjson處理的對象,其類型還是JSONObject/JSONArray
(在debug中斷點運行查看)
有些對數據要求比較高的地方就會報錯

舉個栗子

比如這麼個json:

{
	"key": "abc",
	"value": "123456",
	"list": [{
		"name": "張颯",
		"age": 18
	}, {
		"name": "李思",
		"age": 24
	}]
}

debug運行查看對象可以看到,類型都是JSONObject/JSONArray
並不是我們常見的HashMap/ArrayList
在這裏插入圖片描述

可能有的小夥伴會說你沒有指定類型,我下面用parseObject方法指定一下類型:
在這裏插入圖片描述
最外層其實得到我們想要的了,但是裏面還是JSON的相關類型
可以分別獲取裏面的值,查看類型
可以看到list雖然指定泛型了,但是其類型還是JSONArray
在這裏插入圖片描述

當然,這也有某些特殊辦法(蠢方法)

List<Map<String, Object>> newList = JSONObject.parseObject(list.toString(), List.class);

之後再遍歷newList中每個Map冠以同樣操作,toString()和某個類.class

但是!!!
我不可能對每個都單獨拎出來進行數據處理一遍吧?!

處理方法

可以先把json字符串處理成JSONObject,可以看到,JSONObject實現了Map接口
所以JSONObject也就是個map
在這裏插入圖片描述

轉成JSONObject後,再通過TypeReference對其進行類型的指定,並進行獲取操作
在這裏插入圖片描述
注意是alibaba的TypeReference

com.alibaba.fastjson.TypeReference

還有注意後面不是構造函數!!!

JSONObject jsonObject = JSONObject.parseObject(str);
String key = jsonObject.getObject("key", new TypeReference<String>(){});
String value = jsonObject.getObject("value", new TypeReference<String>(){});
List<Map<String, Object>> list = jsonObject.getObject("list", new TypeReference<List<Map<String, Object>>>(){});

可能有的小夥伴也發現了還有JSONObject.getObject(String key, Class clazz)方法
可以看一下下面的運行結果
還是JSON的相關類型
在這裏插入圖片描述

那爲什麼呢?
可以一層一層點進去
會發現底層其實就是經過各種判斷後的一個安全的強轉
(代碼太長,只截取了部分,以Map爲例)
所以和之前的強轉並沒後什麼區別
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章