GSON封装(解决数字转成double问题)

版权声明:本文为博主原创,转载请保留文章全部内容 https://blog.csdn.net/Lyj19910516/article/details/51325712

项目需求:
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());
    }

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

猜你喜欢

转载自blog.csdn.net/Lyj19910516/article/details/51325712
今日推荐