先說結論
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爲例)
所以和之前的強轉並沒後什麼區別