项目需求:
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());
}
如果有更好的方案,可以多多交流,共同进步!