怎么把JSON转换为List对象数组
在Java开发中,JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,广泛应用于前后端数据交互、配置文件存储等场景,当我们从接口获取或读取文件中的JSON数据时,常常需要将其转换为程序中的List对象数组(如List<User>、List<Map<String, Object>>等),以便进行后续的业务逻辑处理,本文将以Java为例,详细介绍JSON转换为List对象数组的方法,包括核心步骤、常用工具的使用及常见问题的解决。
核心思路:JSON与List对象的转换逻辑
无论是哪种JSON工具库,将JSON转换为List对象数组的核心逻辑都分为两步:
- 将JSON字符串解析为中间数据结构:通常是
List或JSONArray(不同工具库对JSON数组的封装不同)。 - 将中间数据结构转换为目标List对象数组:通过反序列化操作,将JSON中的每个元素映射为Java对象,最终填充到
List中。
关键在于明确JSON的结构(是纯数组[{...}, {...}],还是包含数组的对象{"data": [{...}]})以及Java对象的类型定义(是否使用实体类)。
常用工具库及实战
Java生态中,处理JSON的工具有很多,如Jackson、Gson、Fastjson等,下面以最常用的Jackson和Gson为例,演示不同场景下的转换方法。
(一)使用Jackson(Spring Boot默认集成)
Jackson是高性能的JSON处理库,广泛应用于Spring Boot项目,其核心类包括ObjectMapper(用于JSON与Java对象的互转)、JsonParser(JSON解析器)等。
准备工作:添加依赖
若使用Maven,在pom.xml中添加Jackson依赖:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.2</version> <!-- 使用最新稳定版本 -->
</dependency>
场景1:JSON数组转List<实体类>
假设JSON字符串为[{"id":1,"name":"张三","age":25},{"id":2,"name":"李四","age":30}],目标是转换为List<User>。
步骤1:定义实体类
public class User {
private Integer id;
private String name;
private Integer age;
// 无参构造器(Jackson反序列化时需要)
public User() {}
// 有参构造器、getter/setter、toString()方法(省略,实际开发中建议生成)
}
步骤2:使用ObjectMapper转换
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.List;
public class JacksonJsonToList {
public static void main(String[] args) throws Exception {
String jsonStr = "[{\"id\":1,\"name\":\"张三\",\"age\":25},{\"id\":2,\"name\":\"李四\",\"age\":30}]";
ObjectMapper objectMapper = new ObjectMapper();
// 关键:使用TypeReference指定List的泛型类型
List<User> userList = objectMapper.readValue(jsonStr, new TypeReference<List<User>>() {});
// 输出结果
userList.forEach(System.out::println);
}
}
说明:
objectMapper.readValue()是Jackson的核心方法,用于将JSON字符串转为Java对象。- 由于
List<User>是泛型类型,直接传List<User>.class会编译报错(Java泛型擦除),因此需要通过new TypeReference<List<User>>() {}明确告诉Jackson目标类型是“包含User对象的List”。
场景2:JSON数组转List<Map<String, Object>>
如果JSON结构不固定,或不想定义实体类,可以转换为List<Map<String, Object>>,其中Map的key为JSON字段名,value为对应值。
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.List;
import java.util.Map;
public class JacksonJsonToMapList {
public static void main(String[] args) throws Exception {
String jsonStr = "[{\"id\":1,\"name\":\"张三\",\"age\":25},{\"id\":2,\"name\":\"李四\",\"age\":30}]";
ObjectMapper objectMapper = new ObjectMapper();
// 指定目标类型为List<Map<String, Object>>
List<Map<String, Object>> mapList = objectMapper.readValue(jsonStr, new TypeReference<List<Map<String, Object>>>() {});
// 输出结果
mapList.forEach(map -> System.out.println(map));
}
}
输出示例:
{id=1, name=张三, age=25}
{id=2, name=李四, age=30}
场景3:嵌套JSON(对象中包含数组)转List
若JSON是对象格式,如{"code":200,"data":[{"id":1,"name":"张三"},{"id":2,"name":"李四"}]},需要先解析外层对象,再提取data字段转为List。
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.List;
public class NestedJsonToList {
public static void main(String[] args) throws Exception {
String jsonStr = "{\"code\":200,\"data\":[{\"id\":1,\"name\":\"张三\"},{\"id\":2,\"name\":\"李四\"}]}";
ObjectMapper objectMapper = new ObjectMapper();
// 1. 先转为包含data字段的Map或自定义Response对象
Response response = objectMapper.readValue(jsonStr, Response.class);
// 2. 从response中提取data字段(假设Response类中有getData()方法)
List<User> userList = response.getData();
System.out.println(userList);
}
// 假设的Response类(对应外层JSON对象)
static class Response {
private int code;
private List<User> data;
// getter/setter
public int getCode() { return code; }
public void setCode(int code) { this.code = code; }
public List<User> getData() { return data; }
public void setData(List<User> data) { this.data = data; }
}
}
(二)使用Gson(Google开源库)
Gson是Google推出的JSON处理库,以简洁易用著称,适合轻量级项目。
准备工作:添加依赖
Maven依赖:
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version> <!-- 最新版本 -->
</dependency>
场景1:JSON数组转List<实体类>
同样以[{"id":1,"name":"张三","age":25}]为例,转换为List<User>。
步骤1:定义实体类(同Jackson)
public class User {
private Integer id;
private String name;
private Integer age;
// 无参构造器、getter/setter(省略)
}
步骤2:使用Gson转换
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.util.List;
public class GsonJsonToList {
public static void main(String[] args) {
String jsonStr = "[{\"id\":1,\"name\":\"张三\",\"age\":25},{\"id\":2,\"name\":\"李四\",\"age\":30}]";
Gson gson = new Gson();
// 关键:使用TypeToken指定List的泛型类型(与Jackson类似)
List<User> userList = gson.fromJson(jsonStr, new TypeToken<List<User>>() {}.getType());
userList.forEach(System.out::println);
}
}
说明:
gson.fromJson()是Gson的核心方法,第二个参数需要传入Type对象,通过new TypeToken<List<User>>() {}.getType()获取。- 实体类同样需要无参构造器,否则Gson无法实例化对象。
场景2:JSON数组转List<Map<String, Object>>
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.util.List;
import java.util.Map;
public class GsonJsonToMapList {
public static void main(String[] args) {
String jsonStr = "[{\"id\":1,\"name\":\"张三\",\"age\":25}]";
Gson gson = new Gson();
List<Map<String, Object>> mapList = gson.fromJson(jsonStr, new TypeToken<List<Map<String, Object>>>() {}.getType());
mapList.forEach(System.out::println);
}
}
(三)使用Fastjson(阿里巴巴开源库)
Fastjson是阿里巴巴推出的高性能JSON库,在国内使用广泛,但需注意其安全性问题(建议使用1.2.83+版本)。
准备工作:添加依赖
M



还没有评论,来说两句吧...