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

Java中如何将JSON转换为Map<String, List<Object>>

JSON转指定结构Map的Java实现方案

Java生态做JSON解析不需要手写底层逻辑,直接用成熟的开源库即可,以下是可直接运行的实现代码。

前置定义:列表元素实体类

你的JSON结构中每个数组项固定包含host(字符串类型)、isEnabled(布尔类型)两个字段,先定义对应的POJO类保证类型安全:

public class HostConfig {
    private String host;
    private Boolean isEnabled;

    // JSON反射序列化必须保留无参构造
    public HostConfig() {}

    // 自行补充getter/setter方法
    public String getHost() { return host; }
    public void setHost(String host) { this.host = host; }
    public Boolean getIsEnabled() { return isEnabled; }
    public void setIsEnabled(Boolean enabled) { this.isEnabled = enabled; }
}

方案1:基于Jackson实现(Spring生态默认内置)

SpringBoot/Spring项目默认已经集成Jackson依赖,不需要额外引入包,直接写解析逻辑即可:

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.List;
import java.util.Map;

public class JacksonJsonParser {
    // 全局单例ObjectMapper,线程安全不要重复创建
    private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();

    public static Map<String, List<HostConfig>> parse(String jsonContent) throws Exception {
        // 用TypeReference规避Java泛型擦除问题,明确指定转换的目标结构
        return OBJECT_MAPPER.readValue(jsonContent, new TypeReference<Map<String, List<HostConfig>>>() {});
    }

    // 测试验证
    public static void main(String[] args) throws Exception {
        String testJson = """
        {
          "name1": [
            {"host": "host1", "isEnabled": true},
            {"host": "host2", "isEnabled": false}
          ],
          "name2": [
            {"host": "host1", "isEnabled": true},
            {"host": "host2", "isEnabled": false}
          ]
        }
        """;
        Map<String, List<HostConfig>> resultMap = parse(testJson);
        // 输出结果:host1
        System.out.println(resultMap.get("name1").get(0).getHost());
        // 输出结果:false
        System.out.println(resultMap.get("name2").get(1).getIsEnabled());
    }
}

如果你不想单独定义HostConfig类,也可以把目标类型改成Map<String, List<Map<String, Object>>>,取值时手动做类型转换即可,这种方式灵活性高但没有类型校验,不推荐生产环境使用。


方案2:基于Gson实现

如果项目中已经引入Gson依赖(Android项目常用),实现逻辑和Jackson基本一致:

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.util.List;
import java.util.Map;

public class GsonJsonParser {
    private static final Gson GSON = new Gson();

    public static Map<String, List<HostConfig>> parse(String jsonContent) {
        return GSON.fromJson(jsonContent, new TypeToken<Map<String, List<HostConfig>>>() {}.getType());
    }

    public static void main(String[] args) {
        String testJson = """
        {
          "name1": [
            {"host": "host1", "isEnabled": true},
            {"host": "host2", "isEnabled": false}
          ],
          "name2": [
            {"host": "host1", "isEnabled": true},
            {"host": "host2", "isEnabled": false}
          ]
        }
        """;
        Map<String, List<HostConfig>> resultMap = parse(testJson);
        System.out.println(resultMap.get("name1").get(0).getHost());
    }
}

注意事项

  • 不要自己手写字符串切割逻辑解析JSON,转义字符、嵌套结构、类型转换的边界情况极多,手写逻辑大概率出生产bug
  • 如果JSON字段名和Java类字段名不匹配,用Jackson的@JsonProperty注解、Gson的@SerializedName注解做字段映射即可
  • 两个库默认返回的Map实现是LinkedHashMap,会保留原始JSON的键顺序,如果不需要保留顺序可以自行传入HashMap构造方法转换。

内容的提问来源于stack exchange,提问作者newbie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 01:06:22