一、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/n/256825.html
微信扫一扫
支付宝扫一扫