如何使用Jackson将JSON转换为java.util.List<HashMap<String,String>>集合
Jackson提取指定字段转换为List<HashMap<String,String>>实现方案
前置依赖
首先确保项目引入Jackson核心依赖,Maven配置如下:
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.15.2</version> <!-- 可替换为项目兼容的稳定版本 --> </dependency>
方案1:JsonNode树模型解析(无需定义额外DTO)
适合临时解析、结构不固定的场景,直接遍历JSON节点提取字段:
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import java.util.ArrayList; import java.util.HashMap; import java.util.List; public class JacksonParseDemo { // ObjectMapper线程安全,建议单例使用 private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); public List<HashMap<String, String>> parseJson(String jsonStr) throws Exception { List<HashMap<String, String>> resultList = new ArrayList<>(); // 把JSON字符串解析为树节点 JsonNode rootNode = OBJECT_MAPPER.readTree(jsonStr); // 获取data数组节点 JsonNode dataArray = rootNode.path("obj").path("data"); // 遍历数组每个元素 for (JsonNode item : dataArray) { HashMap<String, String> map = new HashMap<>(); // 提取name字段 String name = item.path("name").asText(); // 提取value下的num字段 String num = item.path("value").path("num").asText(); map.put("name", name); map.put("num", num); resultList.add(map); } return resultList; } }
方案2:DTO反序列化后转换(适合结构固定的业务场景)
先定义和JSON结构匹配的DTO类,反序列化后流式转换为目标集合,代码可维护性更高:
首先定义DTO类:
// 根节点DTO @Data // Lombok注解,省略getter/setter,无Lombok自行手写即可 public class RespDTO { private Integer code; private String msg; private ObjDTO obj; private Boolean success; private Long duration; } // obj节点DTO @Data public class ObjDTO { private List<DataItemDTO> data; } // data数组元素DTO @Data public class DataItemDTO { private String name; private ValueDTO value; } @Data public class ValueDTO { private String num; }
转换逻辑:
import com.fasterxml.jackson.databind.ObjectMapper; import java.util.HashMap; import java.util.List; import java.util.stream.Collectors; public class JacksonParseDemo2 { private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); public List<HashMap<String, String>> parseJson(String jsonStr) throws Exception { // 先反序列化为RespDTO对象 RespDTO resp = OBJECT_MAPPER.readValue(jsonStr, RespDTO.class); // 流式转换为目标集合 return resp.getObj().getData().stream() .map(item -> { HashMap<String, String> map = new HashMap<>(); map.put("name", item.getName()); map.put("num", item.getValue().getNum()); return map; }) .collect(Collectors.toList()); } }
注意事项
- path方法不会抛出空指针异常,字段不存在时会返回空节点,asText默认返回空字符串,如需处理字段缺失场景可自行加
hasNonNull判断 - ObjectMapper是线程安全的,不要每次调用都new新实例,建议在Spring项目中注入单例,普通项目定义为静态常量使用
- 如果num字段需要转换为数值类型,可替换
asText()为asInt()/asLong()后再转为字符串即可
内容的提问来源于stack exchange,提问作者Criwran
相关产品推荐
相关产品推荐

