java之json串转Map的整理

Java中将JSON字符串转为Map应优先选Jackson,因其生态成熟、Spring Boot原生集成;Fastjson需注意1.x安全漏洞,Gson适用于Android等轻量场景。

Java中将JSON字符串转为Map,核心是选对库、注意类型匹配、处理嵌套结构。最常用的是Jackson和Fastjson,Gson也支持但写法稍不同。

用Jackson转JSON串为Map

Jackson的ObjectMapper默认可将JSON解析为LinkedHashMap(保持字段顺序),适合简单场景。

  • 添加Maven依赖:com.fasterxml.jackson.core:jackson-databind
  • 基础写法:
    ObjectMapper mapper = new ObjectMapper();
    Map map = mapper.readValue(jsonStr, Map.class);
  • 若JSON含嵌套对象或数组,Object会自动映射为LinkedHashMapArrayList,取值时需向下转型
  • 推荐指定泛型以提升类型安全:
    Map map = mapper.readValue(jsonStr, 
        new TypeReference>() {});

用Fastjson转JSON串为Map

Fastjson(尤其1.x)对Map转换非常简洁,但要注意版本差异和安全性(2.x已重构,API不兼容)。

  • 1.x常用写法:
    Map map = JSON.parseObject(jsonStr, Map.

    class);
  • 支持直接解析为JSONObject(本质是LinkedHashMap子类),便于链式取值:
    JSONObject obj = JSON.parseObject(jsonStr);
    String name = obj.getString("name");
  • 注意:Fastjson 1.x存在反序列化漏洞,生产环境建议升级到2.x或改用Jackson/Gson

处理常见坑点

无论用哪个库,以下问题高频出现:

  • 数字类型自动转成Double:JSON中的123会被解析为Double而非Integer,比较时用Objects.equals(),或提前转类型
  • 空值与null字段:默认不保留null字段;如需保留,Jackson需配置mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL)并设为ALWAYS
  • 中文乱码:确保JSON字符串本身编码为UTF-8,且ObjectMapper未被错误设置字符集(通常无需手动设)
  • 日期格式异常:含时间字段时,Jackson默认按ISO格式解析;自定义格式需注册SimpleModule + StdDateFormat

简单对比与建议

日常开发优先选Jackson:生态成熟、Spring Boot原生集成、文档丰富、安全性高。Fastjson适合老项目快速适配,但新项目不建议引入。Gson语法略啰嗦,但Google维护稳定,适合Android或轻量场景。

基本上就这些,选一个库吃透,比来回切换更高效。