如何获取List中的JSON数据:从基础到实践的全面指南
在Java开发中,处理JSON数据已成为日常场景,尤其是从List集合中提取或解析JSON数据时,常常需要根据实际需求灵活操作,无论是将List转换为JSON字符串,还是从JSON字符串中解析出List数据,亦或是从List中提取特定JSON字段的值,这些方法都能高效解决数据流转问题,本文将结合具体场景和代码示例,详细讲解如何获取List中的JSON数据。
List与JSON的基础概念
在开始具体操作前,先明确两个核心概念:
- List:Java中的集合接口,存储有序、可重复的元素,常用于存放对象(如
List<User>)或基本类型数据(如List<String>)。 - JSON(JavaScript Object Notation):轻量级的数据交换格式,以键值对(
"key": value)和数组([value1, value2, ...])形式组织数据,易于人阅读和机器解析。
从List生成JSON字符串(序列化)
有时需要将List中的对象转换为JSON字符串,以便存储或传输,这通常通过“序列化”实现,即把Java对象转换为JSON格式,常用工具库有Jackson、Gson和Fastjson。
使用Jackson(推荐)
Jackson是Java生态中最流行的JSON处理库,高效且功能全面。
步骤:
(1)添加Maven依赖:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.2</version>
</dependency>
(2)编写代码:
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.ArrayList;
import java.util.List;
public class ListToJson {
public static void main(String[] args) {
// 1. 准备List数据(假设存储User对象)
List<User> userList = new ArrayList<>();
userList.add(new User(1, "张三", 25));
userList.add(new User(2, "李四", 30));
// 2. 创建ObjectMapper实例
ObjectMapper objectMapper = new ObjectMapper();
// 3. 将List转换为JSON字符串
try {
String jsonStr = objectMapper.writeValueAsString(userList);
System.out.println("List转JSON字符串:");
System.out.println(jsonStr);
// 输出:[{"id":1,"name":"张三","age":25},{"id":2,"name":"李四","age":30}]
} catch (JsonProcessingException e) {
e.printStackTrace();
}
}
}
// User实体类
class User {
private int id;
private String name;
private int age;
public User(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
// getter和setter方法(Jackson需要通过反射访问属性,必须提供)
public int getId() { return id; }
public void setId(int id) { this.id = id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }
}
关键点:
- 实体类(如
User)需提供无参构造方法(Jackson默认使用)和getter/setter方法。 ObjectMapper是Jackson的核心类,负责序列化与反序列化。
使用Gson
Gson是Google推出的JSON库,简单易用。
步骤:
(1)添加Maven依赖:
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version>
</dependency>
(2)编写代码:
import com.google.gson.Gson;
import java.util.ArrayList;
import java.util.List;
public class ListToJsonWithGson {
public static void main(String[] args) {
// 准备List数据
List<User> userList = new ArrayList<>();
userList.add(new User(1, "张三", 25));
userList.add(new User(2, "李四", 30));
// 创建Gson实例
Gson gson = new Gson();
// 转换为JSON字符串
String jsonStr = gson.toJson(userList);
System.out.println("Gson转换结果:");
System.out.println(jsonStr);
// 输出:[{"id":1,"name":"张三","age":25},{"id":2,"name":"李四","age":30}]
}
}
// User实体类同上
关键点:
- Gson无需额外配置,直接调用
gson.toJson()即可完成序列化。 - 实体类同样需要
getter/setter方法。
从JSON字符串解析为List(反序列化)
与序列化相反,反序列化是将JSON字符串转换为Java List对象,常见场景包括解析API返回的JSON数据或读取JSON文件。
使用Jackson
步骤:
假设有以下JSON字符串:
[
{"id": 1, "name": "张三", "age": 25},
{"id": 2, "name": "李四", "age": 30}
]
编写代码解析为List<User>:
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.List;
public class JsonToList {
public static void main(String[] args) {
String jsonStr = "[{\"id\":1,\"name\":\"张三\",\"age\":25},{\"id\":2,\"name\":\"李四\",\"age\":30}]";
ObjectMapper objectMapper = new ObjectMapper();
try {
// 使用TypeReference指定泛型类型,避免类型丢失
List<User> userList = objectMapper.readValue(jsonStr, new TypeReference<List<User>>() {});
System.out.println("JSON字符串转List:");
userList.forEach(user ->
System.out.println("id: " + user.getId() + ", name: " + user.getName() + ", age: " + user.getAge())
);
// 输出:
// id: 1, name: 张三, age: 25
// id: 2, name: 李四, age: 30
} catch (Exception e) {
e.printStackTrace();
}
}
}
// User实体类同上
关键点:
objectMapper.readValue()的第二个参数需使用TypeReference明确指定List<User>的类型,否则默认会解析为List<HashMap>,导致无法直接获取对象属性。- 若JSON字符串是数组形式(如
[...]),可直接解析为List;若是单个对象(如{"key": "value"}),则需解析为实体类再转为List(如List.of(object))。
使用Gson
步骤:
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.lang.reflect.Type;
import java.util.List;
public class JsonToListWithGson {
public static void main(String[] args) {
String jsonStr = "[{\"id\":1,\"name\":\"张三\",\"age\":25},{\"id\":2,\"name\":\"李四\",\"age\":30}]";
Gson gson = new Gson();
// 使用TypeToken指定泛型类型
Type userListType = new TypeToken<List<User>>() {}.getType();
List<User> userList = gson.fromJson(jsonStr, userListType);
System.out.println("Gson解析结果:");
userList.forEach(user ->
System.out.println("id: " + user.getId() + ", name: " + user.getName() + ", age: " + user.getAge())
);
}
}
// User实体类同上
关键点:
- Gson通过
TypeToken处理泛型类型,与Jackson的TypeReference作用类似。
从List中提取JSON字段的特定值
有时List中的元素已经是JSON字符串(如List<String>,每个String是JSON格式),需要提取其中的特定字段(如提取所有用户的name)。
场景示例
假设List存储的是JSON格式的用户字符串:
List<String> jsonList = new ArrayList<>();
jsonList.add("{\"id\":1,\"name\":\"张三\",\"age\":25}");
jsonList.add("{\"id\":2,\"name\":\"李四\",\"age\":30}");
目标:提取所有用户的name,存入新的List(如List<String>)。
解决方法
使用Jackson解析每个JSON字符串并提取字段
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.ArrayList;
import java.util.List;
public class ExtractFieldFromListJson {
public static void main(String[] args) {
List<String> jsonList = new ArrayList<>();
jsonList.add("{\"id\":1,\"name\":\"张三\",\"age\":25}");
jsonList


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