1. 程式人生 > >GSON封裝(解決數字轉成double問題)

GSON封裝(解決數字轉成double問題)

專案需求:
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());
    }

如果有更好的方案,可以多多交流,共同進步!