GSON封裝(解決數字轉成double問題)
阿新 • • 發佈:2018-12-26
專案需求:
1.將json資料封裝成 Map
/**
* json 轉 map
*
* @param jsonStr
* 要轉換的json字串
* @return
*/
public static Map<String, Object> JsonToMap(String jsonStr) {
return JsonToMap(jsonStr, null);
}
/**
* json 轉 map
*
* @param jsonStr
* 要轉換的json字串
* @param result
* 轉換的結果放入位置
* @return
*/
public static Map<String, Object> JsonToMap(String jsonStr, Map<String, Object> result) {
if (jsonStr == null) {
return null;
}
if (result == null) {
result = new HashMap<String, Object>();
}
JsonParser jsonParser = new JsonParser();
JsonElement jsonElement = jsonParser.parse(jsonStr);
return JsonToMap(result, "▲▼◆", jsonElement);
}
/**
* json 轉 map
*
* @param result
* 要轉換的json字串
* @param key
* key
* @param value
* value
* @return
*/
private static Map<String, Object> JsonToMap(Map<String, Object> result, String key, JsonElement value) {
// 如果key為null 直接報錯
if (key == null) {
throw new RuntimeException("key值不能為null");
}
// 如果value為null,則直接put到map中
if (value == null) {
result.put(key, value);
} else {
// 如果value為基本資料型別,則放入到map中
if (value.isJsonPrimitive()) {
result.put(key, value.getAsString());
} else if (value.isJsonObject()) {
// 如果value為JsonObject資料型別,則遍歷此JSONObject,進行遞迴呼叫本方法
JsonObject jsonObject = value.getAsJsonObject();
Iterator<Entry<String, JsonElement>> iterator = jsonObject.entrySet().iterator();
while (iterator.hasNext()) {
Entry<String, JsonElement> next = iterator.next();
result = JsonToMap(result, next.getKey(), next.getValue());
}
} else if (value.isJsonArray()) {
// 如果value為JsonArray資料型別,則遍歷此JsonArray,進行遞迴呼叫本方法
JsonArray jsonArray = value.getAsJsonArray();
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
for (int i = 0, len = jsonArray.size(); i < len; i++) {
Map<String, Object> tempMap = new HashMap<String, Object>();
JsonObject jsonObject = jsonArray.get(i).getAsJsonObject();
Iterator<Entry<String, JsonElement>> iterator = jsonObject.entrySet().iterator();
while (iterator.hasNext()) {
Entry<String, JsonElement> next = iterator.next();
tempMap = JsonToMap(tempMap, next.getKey(), next.getValue());
}
list.add(tempMap);
}
result.put(key, list);
}
}
// 返回最終結果
return result;
}
前兩個方法過載主要是為了滿足兩種需求,第一種是不傳入儲存鍵值對的容器,第二種是呼叫者已經存在儲存鍵值對的容器。
第三個方法是實現的核心邏輯。
測試類
public static void main(String[] args) {
String testJson = "{\"RespCode\":\"00\"," + "\"Msg\":"
+ "[{\"toDay\":\"星期二\",\"qryYieldDate\":\"2016-04-29\",\"qryDate\":\"星期五\",\"login\":\"noLogin\",\"treasureFlag\":null,\"calDate\":\"星期四\",\"yield\":\"2.4070\",\"calYieldDate\":\"2016-04-28\",\"fundIncome\":\"0.7131\",\"workdate\":\"2016-04-25\"},"
+ "{\"toDay\":\"星期二\",\"qryYieldDate\":\"2016-04-29\",\"qryDate\":\"星期五\",\"login\":\"noLogin\",\"treasureFlag\":null,\"calDate\":\"星期四\",\"yield\":\"2.4070\",\"calYieldDate\":\"2016-04-28\",\"fundIncome\":\"0.7131\",\"workdate\":\"2016-04-25\"}"
+ "]}";
Map<String, Object> jsonToMap = JsonToMap(testJson);
System.out.println(jsonToMap.toString());
}
如果有更好的方案,可以多多交流,共同進步!