您的位置:

JSON转Map的详细阐述

一、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
    
     >() {
        });
    } 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
    
     > list = objectMapper.readValue(jsonArrayStr, new TypeReference
      
       
        
         >>() { }); 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
   >
 */
public static List
    
     > jsonToList(String jsonStr) {
    ObjectMapper objectMapper = new ObjectMapper();
    try {
        return objectMapper.readValue(jsonStr, new TypeReference
      
       
        
         >>() { }); } catch (Exception e) { e.printStackTrace(); return null; } } /** * JSON转Set * * @param jsonStr JSON字符串 * @return Set
         
          
           > */ public static Set
           
            
             > jsonToSet(String jsonStr) { List
             
              
               > 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种方法:

  1. 使用Jackson等库提供的API将JSON转换成Map对象
  2. 将JSON数组转换成List,再将List转换成Map对象
  3. 将JSON转换成Java对象,再将Java对象转换成Map对象
  4. 使用自己实现的JSON转Map方法
  5. 将JSON转换成其他Java集合对象,如List和Set等
  6. 将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
    
     >() {
    });
}

     
   
  

使用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
    
     >() {
        });
    } 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对象>>等泛型类型。