一、JSON轉Map方法
在Java中,將JSON轉換為Map可以使用Jackson等庫提供的API,在使用前需要添加JAR包並導入相應的類。下面是一個JSON轉Map的方法:
/**
* JSON字元串轉Map
*
* @param jsonStr JSON字元串
* @return Map
*/
public static Map jsonToMap(String jsonStr) {
ObjectMapper objectMapper = new ObjectMapper();
try {
return objectMapper.readValue(jsonStr, new TypeReference<Map>() {
});
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
使用ObjectMapper的readValue()方法將JSON字元串轉換成Map對象,其中new TypeReference<Map<String, Object>>(){}指定返回的Map的鍵值類型為String和Object。
二、JSON數組轉Map
如果JSON字元串是一個數組,那麼在轉換成Map時需要先將數組轉換成List,然後再將List轉換成Map。
/**
* JSON數組轉Map
*
* @param jsonArrayStr JSON數組字元串
* @return Map
*/
public static Map jsonArrayToMap(String jsonArrayStr) {
ObjectMapper objectMapper = new ObjectMapper();
try {
List<Map> list = objectMapper.readValue(jsonArrayStr, new TypeReference<List<Map>>() {
});
if (!list.isEmpty()) {
return list.get(0);
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
使用ObjectMapper的readValue()方法將JSON字元串轉換成List<Map<String, Object>>對象,然後取List中的第一個元素作為Map對象返回。
三、JSON轉Map對象
如果JSON字元串中只包含一個對象,那麼可以直接將JSON轉換成Java對象,再將Java對象轉換成Map。
/**
* JSON轉Map對象
*
* @param jsonStr JSON字元串
* @return Map
*/
public static Map jsonToMapObject(String jsonStr) {
ObjectMapper objectMapper = new ObjectMapper();
try {
Object obj = objectMapper.readValue(jsonStr, Object.class);
return jsonToMap(objectMapper.writeValueAsString(obj));
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
使用ObjectMapper的readValue()方法將JSON字元串轉換成Java對象,然後使用ObjectMapper的writeValueAsString()方法將Java對象轉換成JSON字元串,最後再使用jsonToMap()方法將JSON轉換成Map對象。
四、JSON轉Map方法實現
除了使用Jackson等庫提供的API將JSON轉換成Map對象外,還可以自己實現JSON轉Map方法。
/**
* JSON轉Map方法實現
*
* @param jsonStr JSON字元串
* @return Map
*/
public static Map jsonToMapByHand(String jsonStr) {
Map map = new HashMap();
if (jsonStr != null && !jsonStr.equals("")) {
// 去掉首尾的{}
jsonStr = jsonStr.substring(1, jsonStr.length() - 1);
// 分離鍵值對
String[] pairs = jsonStr.split(",");
for (String pair : pairs) {
String[] keyValue = pair.split(":");
if (keyValue.length == 2) {
String key = keyValue[0].trim();
String value = keyValue[1].trim();
if (value.startsWith("{")) {
// 處理值為對象,遞歸處理
map.put(key, jsonToMapByHand(value));
} else {
// 處理值為字元串、數字、布爾類型、null
if (value.startsWith("\"") && value.endsWith("\"")) {
value = value.substring(1, value.length() - 1);
}
if (value.equals("null")) {
value = null;
} else if (value.equals("true")) {
value = "1";
} else if (value.equals("false")) {
value = "0";
}
map.put(key, value);
}
}
}
}
return map;
}
首先去掉JSON字元串的首尾大括弧,然後分離出鍵值對,對值進行處理。對於值為對象的鍵值對,使用遞歸處理。
五、JSON轉Map方式
除了將JSON轉換成Map對象外,也可以將JSON轉換成其他Java集合對象,如List和Set等。
/**
* JSON轉List
*
* @param jsonStr JSON字元串
* @return List<Map>
*/
public static List<Map> jsonToList(String jsonStr) {
ObjectMapper objectMapper = new ObjectMapper();
try {
return objectMapper.readValue(jsonStr, new TypeReference<List<Map>>() {
});
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* JSON轉Set
*
* @param jsonStr JSON字元串
* @return Set<Map>
*/
public static Set<Map> jsonToSet(String jsonStr) {
List<Map> list = jsonToList(jsonStr);
if (list != null) {
return new HashSet(list);
}
return null;
}
使用ObjectMapper的readValue()方法將JSON字元串轉換成List<Map<String, Object>>對象,或者先將JSON字元串轉換成List<Java對象>,再轉換成List<Map<String, Object>>對象。從List轉換成Set可以使用HashSet的構造函數。
六、JSON轉Map的6種方法
經過上述的講解,可以總結出JSON轉Map的6種方法:
- 使用Jackson等庫提供的API將JSON轉換成Map對象
- 將JSON數組轉換成List,再將List轉換成Map對象
- 將JSON轉換成Java對象,再將Java對象轉換成Map對象
- 使用自己實現的JSON轉Map方法
- 將JSON轉換成其他Java集合對象,如List和Set等
- 將JSON轉換成字元串,再使用Java的正則表達式等方法解析字元串成Map對象
七、JSON轉Map最快的方法
對於性能要求高的場景,使用快速JSON庫可以實現更快的JSON轉Map。
/**
* 快速JSON轉Map
*
* @param jsonStr JSON字元串
* @return Map
*/
public static Map jsonToMapFast(String jsonStr) {
return JSON.parseObject(jsonStr, new TypeReference<Map>() {
});
}
使用FastJson的parseObject()方法將JSON字元串轉換成Map對象,其中new TypeReference<Map<String, Object>>(){}指定返回的Map的鍵值類型為String和Object。
八、JSON轉Map保留null
默認情況下,JSON轉換成Java對象時,會將值為null的屬性忽略掉。如果需要保留值為null的屬性,可以使用Jackson等庫提供的配置。
/**
* JSON轉Map保留null
*
* @param jsonStr JSON字元串
* @return Map
*/
public static Map jsonToMapWithNull(String jsonStr) {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setSerializationInclusion(JsonInclude.Include.ALWAYS);
try {
return objectMapper.readValue(jsonStr, new TypeReference<Map>() {
});
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
使用ObjectMapper的setSerializationInclusion()方法將null值序列化到JSON字元串中。
九、JSON轉Map指定泛型
如果需要將JSON轉換成Map<String, List<Java對象>>等泛型類型,可以使用Jackson等庫提供的API指定泛型。
/**
* JSON轉Map指定泛型
*
* @param jsonStr JSON字元串
* @param genericType 泛型類型
* @param elementClazz 泛型元素類型
* @param 泛型類型
* @return Map
*/
public static Map jsonToMapWithType(String jsonStr, Class genericType, Class elementClazz) {
ObjectMapper objectMapper = new ObjectMapper();
JavaType type = objectMapper.getTypeFactory().constructMapType(genericType, String.class, elementClazz);
try {
return objectMapper.readValue(jsonStr, type);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
使用ObjectMapper的getTypeFactory()方法構造Map<String, List<Java對象>>等泛型類型。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/256825.html
微信掃一掃
支付寶掃一掃