1. 程式人生 > >轉換複雜的JSON物件為Map物件

轉換複雜的JSON物件為Map物件

本文在參考https://www.cnblogs.com/Animation-programmer/p/7997621.html後,在原來程式碼上做了改動(添加了對內層json的遞迴解析),寫成了工具方法

一、問題描述

現有如下呼叫介面返回的json資料,

 

需要將其轉換為Map物件,如果json中含有陣列,則在對應的Map物件中巢狀ArrayList。解析結果如下圖所示:

 

二、程式碼實現

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

import java.util.*;

public class JSONUtil {

/**
* 將json物件轉換為HashMap
* @param json
* @return
*/
public static Map<String, Object> parseJSON2Map(JSONObject json) {
Map<String, Object> map = new HashMap<String, Object>();
// 最外層解析
for (Object k : json.keySet()) {
Object v = json.get(k);
// 如果內層還是json陣列的話,繼續解析
if (v instanceof JSONArray) {
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
Iterator<JSONObject> it = ((JSONArray) v).iterator();
while (it.hasNext()) {
JSONObject json2 = it.next();
list.add(parseJSON2Map(json2));
}
map.put(k.toString(), list);
} else if (v instanceof JSONObject) {
// 如果內層是json物件的話,繼續解析
map.put(k.toString(), parseJSON2Map((JSONObject) v));
} else {
// 如果內層是普通物件的話,直接放入map中
map.put(k.toString(), v);
}
}
return map;
}

/**
* 將json字串轉換為Map
* @param jsonStr
* @return
*/
public static Map<String, Object> parseJSONstr2Map(String jsonStr) {
JSONObject json = JSONObject.fromObject(jsonStr);
Map<String, Object> map = parseJSON2Map(json);
return map;
}
}

測試json字串轉Map的方法,符合預期結果:

public static void main(String[] args) {
Map<String, Object> myresult = JSONUtil.parseJSONstr2Map("{" +
"\"data\": {" +
"\"studentList\": [{" +
"\"scourse\": {" +
"\"cname\": \"語文,數學,英語\"," +
"\"cscore\": \"93,95,98\"" +
"}," +
"\"sname\": \"張三\"," +
"\"sage\": \"20\"," +
"\"sid\": \"101\"" +
"}," +
"{" +
"\"scourse\": {" +
"\"cname\": \"物理,化學,生物\"," +
"\"cscore\": \"92,93,97\"" +
"}," +
"\"sname\": \"李四\"," +
"\"sage\": \"30\"," +
"\"sid\": \"102\"" +
"}]" +
"}," +
"\"resultCode\": \"1\"" +
"}");
System.out.println(myresult);
}
補充:生成測試資料的程式碼

public static void main(String[] args) {
List<Map<String, Object>> studentList = new ArrayList<Map<String, Object>>();
Map<String, Object> student = new HashMap<String, Object>(){{
put("sid", "101");
put("sname", "張三");
put("sage", "20");
put("scourse", new HashMap<String, String>(){{
put("cname", "語文,數學,英語");
put("cscore", "93,95,98");
}});
}};
studentList.add(student);
student = new HashMap<String, Object>(){{
put("sid", "102");
put("sname", "李四");
put("sage", "30");
put("scourse", new HashMap<String, String>(){{
put("cname", "物理,化學,生物");
put("cscore", "92,93,97");
}});
}};
studentList.add(student);
Map<String, Object> resultMap = new HashMap<String, Object>(){{
put("data", new HashMap<String, Object>(){{
put("studentList", studentList);
}});
put("resultCode", "1");
}};
System.out.println(JSONObject.fromObject(resultMap).toString());
}