Java中如何高效获取JSON集合数据:从基础到实战
在Java开发中,JSON(JavaScript Object Notation)已成为数据交换的主流格式,无论是调用第三方API、处理前端请求,还是配置文件解析,都离不开对JSON数据的操作。“从JSON中提取集合数据”是最常见的场景之一,本文将系统介绍Java中获取JSON集合的方法,涵盖主流库(如Jackson、Gson、Fastjson)的使用,从基础语法到实战场景,帮你快速这一核心技能。
JSON集合的常见形式与Java对应关系
在开始操作前,需要明确JSON集合与Java对象的对应关系,JSON中的集合主要分为两类:
- 数组(Array):用方括号
[]表示,如["apple", "banana", ["pear", "grape"]],对应Java中的 数组 或 List。 - 对象集合(Object Array):如
[{"name": "张三", "age": 25}, {"name": "李四", "age": 30}],对应Java中的 List(T为自定义实体类)。
理解这种对应关系后,就能根据JSON类型选择合适的解析方式。
主流JSON库对比与选择
目前Java生态中主流的JSON库有:
| 库名 | 特点 | 官方推荐场景 |
|------------|----------------------------------------------------------------------|----------------------------|
| Jackson | 性能高、功能全,Spring Boot默认集成,支持流式解析 | 企业级应用、REST API开发 |
| Gson | Google开发,API简洁,对复杂类型(如泛型)支持友好 | Android开发、轻量级解析 |
| Fastjson| 阿里巴巴开发,解析速度快,但存在安全漏洞(需使用1.2.68+版本) | 国内互联网企业、高并发场景 |
推荐选择:若项目已集成Spring Boot,优先用Jackson;若需简单易用的API,选Gson;若追求极致性能且注意版本安全,可用Fastjson。
Jackson:获取JSON集合的实战方法
Jackson是功能最全面的JSON库,通过 ObjectMapper 类实现JSON与Java对象的互转,以下通过具体场景演示如何获取JSON集合。
解析JSON数组为Java List(基础类型)
假设有以下JSON数组字符串:
["apple", "banana", "orange"]
目标:将其转为 List<String>。
代码实现:
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.List;
public class JacksonArrayToList {
public static void main(String[] args) throws Exception {
String jsonArray = "[\"apple\", \"banana\", \"orange\"]";
ObjectMapper objectMapper = new ObjectMapper();
// 使用 TypeReference 指定泛型类型,避免类型擦除
List<String> fruitList = objectMapper.readValue(jsonArray, new TypeReference<List<String>>() {});
System.out.println(fruitList); // 输出: [apple, banana, orange]
}
}
关键点:
objectMapper.readValue()是核心方法,用于将JSON字符串转为Java对象。- 必须使用
TypeReference明确指定集合的泛型类型(如List<String>),否则会因类型擦除导致编译错误。
解析JSON对象集合为自定义List实体类
假设有以下JSON对象数组:
[
{"id": 1, "name": "张三", "age": 25},
{"id": 2, "name": "李四", "age": 30}
]
目标:转为 List<User>(User为自定义类)。
步骤1:定义User实体类
public class User {
private int id;
private String name;
private int age;
// 必须提供无参构造方法(Jackson反射需要)
public User() {}
// getter/setter 方法
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; }
@Override
public String toString() {
return "User{id=" + id + ", name='" + name + "', age=" + age + "}";
}
}
步骤2:解析JSON为List
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.List;
public class JacksonObjectList {
public static void main(String[] args) throws Exception {
String jsonList = "[{\"id\": 1, \"name\": \"张三\", \"age\": 25}, " +
"{\"id\": 2, \"name\": \"李四\", \"age\": 30}]";
ObjectMapper objectMapper = new ObjectMapper();
// 直接指定 User[].class,再转为 List
List<User> userList = objectMapper.readValue(jsonList, new TypeReference<List<User>>() {});
userList.forEach(System.out::println);
// 输出:
// User{id=1, name='张三', age=25}
// User{id=2, name='李四', age=30}
}
}
关键点:
- 实体类的字段名需与JSON的key完全一致(或通过
@JsonProperty注解映射,如@JsonProperty("user_name") private String name;)。 - 必须提供无参构造方法,否则Jackson反射创建对象时会失败。
处理嵌套集合(如List中包含List)
假设有以下嵌套JSON:
[
{"id": 1, "name": "水果", "items": ["苹果", "香蕉"]},
{"id": 2, "name": "蔬菜", "items": ["白菜", "萝卜"]}
]
目标:转为 List<Category>(Category包含 List<String> items)。
步骤1:定义Category实体类
import java.util.List;
public class Category {
private int id;
private String name;
private List<String> items;
// 无参构造方法 + getter/setter
public Category() {}
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 List<String> getItems() { return items; }
public void setItems(List<String> items) { this.items = items; }
@Override
public String toString() {
return "Category{id=" + id + ", name='" + name + "', items=" + items + "}";
}
}
步骤2:解析嵌套JSON
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.List;
public class JacksonNestedList {
public static void main(String[] args) throws Exception {
String nestedJson = "[{\"id\": 1, \"name\": \"水果\", \"items\": [\"苹果\", \"香蕉\"]}, " +
"{\"id\": 2, \"name\": \"蔬菜\", \"items\": [\"白菜\", \"萝卜\"]}]";
ObjectMapper objectMapper = new ObjectMapper();
List<Category> categoryList = objectMapper.readValue(nestedJson, new TypeReference<List<Category>>() {});
categoryList.forEach(System.out::println);
// 输出:
// Category{id=1, name='水果', items=[苹果, 香蕉]}
// Category{id=2, name='蔬菜', items=[白菜, 萝卜]}
}
}
Jackson会自动递归解析嵌套的集合,无需额外处理。
Gson:简洁优雅的JSON集合解析
Gson由Google开发,API设计更简洁,尤其在处理泛型集合时无需 TypeReference,适合快速开发。
解析JSON数组为List(基础类型)
import com.google.gson.Gson;
import java.util.List;
public class GsonArrayToList {
public static void main(String[] args) {
String jsonArray = "[\"apple\", \"banana\", \"orange\"]";
Gson gson = new Gson();
// 直接使用 gson.fromJson(),第二个参数为 List.class 的子类型
// 通过 TypeToken 解决泛型问题(Gson 2.8+ 支持简化写法)
List<String> fruitList = gson.fromJson(jsonArray, new com.google.gson.reflect.TypeToken<List<String>>() {}.getType());
System.out.println(fruitList); // 输出: [apple, banana, orange]
}
}
关键点:
- Gson通过
TypeToken类获取泛型类型信息,与Jackson的TypeReference作用类似。 - 代码中
new TypeToken<List<String>>() {}.getType()会返回List<String>的完整类型信息。
解析JSON对象集合为自定义List实体类
仍以



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