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
相关产品推荐
相关产品推荐

