You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 10:54:04