在作crm任務分發系統中的【批量修改任務工單的選項】問題時,須要對接口數據進行處理,接口數據舉例以下, java
[
{
"title": "使用狀況",
"options": [
{
"name": "好",
"value": 1
},
{
"name": "很差",
"value": 2
},
{
"name": "還行",
"value": 3
}
]
},
{
"title": "優化狀況",
"options": [
{
"name": "好",
"value": 1
},
{
"name": "很差",
"value": 2
},
{
"name": "還行",
"value": 3
}
]
}
]
|
注意,options裏是個array或者list 。 json
雖然結構複雜,可是也算清晰。一開始想用JSONArray.parseArray(jsondata, HashMap.class); 轉化爲以一個List<HashMap>,而後再取得每一個HashMap,每一個HashMap中又是一個List<HashMap>,而後再遍歷取得HashMap。 函數
可是就在第二次遍歷list的時候出現了異常, 優化
結果運行發現有錯,錯誤信息以下: spa
Exception in thread 「」 java.lang.ClassCastException: com.alibaba.fastjson.JSONObject cannot be cast to java.util.HashMap 接口
跟蹤發現,那個地方其實包含的是個JSONArray,因此cast出錯。 解決方法,對應json格式的數據,寫出對應的java bean,而後再來反序列化。 ci
不過因爲只有一個調用,沒有必要再添加一個bean,因此本身寫了一個處理函數,目的是要讓fastjson處理後,獲得的結果裏再也不有com.alibaba.fastjson包下的類型: get
// 將jsonString轉化爲hashmap
private HashMap<String, Object> fromJson2Map(String jsonString) {
HashMap jsonMap = JSON.parseObject(jsonString, HashMap.class);
HashMap<String, Object> resultMap = new HashMap<String, Object>();
for(Iterator iter = jsonMap.keySet().iterator(); iter.hasNext();){
String key = (String)iter.next();
if(jsonMap.get(key) instanceof JSONArray){
JSONArray jsonArray = (JSONArray)jsonMap.get(key);
List list = handleJSONArray(jsonArray);
resultMap.put(key, list);
}else{
resultMap.put(key, jsonMap.get(key));
}
}
return resultMap;
}
private List<HashMap<String, Object>> handleJSONArray(JSONArray jsonArray){
List list = new ArrayList();
for (Object object : jsonArray) {
JSONObject jsonObject = (JSONObject) object;
HashMap map = new HashMap<String, Object>();
for (Map.Entry entry : jsonObject.entrySet()) {
if(entry.getValue() instanceof JSONArray){
map.put((String)entry.getKey(), handleJSONArray((JSONArray)entry.getValue()));
}else{
map.put((String)entry.getKey(), entry.getValue());
}
}
list.add(map);
}
return list;
}
|