在Java开发的实际场景中,调用第三方或内部服务的REST API并获取返回的JSON数组是高频操作,比如查询批量用户信息、获取商品列表等场景都需要处理这类数据。完整的流程包括发起HTTP请求、接收响应内容、解析JSON数组、提取所需字段并进行后续业务处理这几个核心环节。

发起REST API请求获取响应
首先需要通过Java代码发起HTTP请求,获取REST API返回的原始响应字符串。这里以常用的HttpURLConnection为例,演示如何发送GET请求并读取返回内容:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class ApiRequestUtil {
public static String sendGetRequest(String apiUrl) throws Exception {
URL url = new URL(apiUrl);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
// 设置请求方法为GET
connection.setRequestMethod("GET");
// 设置通用请求属性
connection.setRequestProperty("Accept", "application/json");
connection.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
// 获取响应码
int responseCode = connection.getResponseCode();
if (responseCode != 200) {
throw new RuntimeException("请求失败,响应码:" + responseCode);
}
// 读取响应内容
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));
StringBuilder responseBuilder = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
responseBuilder.append(line);
}
reader.close();
connection.disconnect();
return responseBuilder.toString();
}
}使用Jackson解析JSON数组
Jackson是Java生态中常用的JSON处理库,功能完善且性能稳定,适合解析复杂的JSON结构。首先需要引入Jackson的依赖,如果是Maven项目,在pom.xml中添加如下配置:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.2</version>
</dependency>假设REST API返回的JSON数组格式如下,每个元素包含id、name、age三个字段:
[
{"id": 1, "name": "张三", "age": 25},
{"id": 2, "name": "李四", "age": 28},
{"id": 3, "name": "王五", "age": 22}
]首先定义对应的实体类来映射数组元素:
public class User {
private Integer id;
private String name;
private Integer age;
// 必须提供无参构造方法,Jackson反射需要
public User() {}
public User(Integer id, String name, Integer age) {
this.id = id;
this.name = name;
this.age = age;
}
// getter和setter方法
public Integer getId() { return id; }
public void setId(Integer id) { this.id = id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public Integer getAge() { return age; }
public void setAge(Integer age) { this.age = age; }
}接着使用Jackson的ObjectMapper解析JSON数组为User对象列表:
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.List;
public class JacksonParseDemo {
public static void main(String[] args) {
try {
// 模拟调用API获取返回的JSON字符串
String jsonResponse = "[{\"id\": 1, \"name\": \"张三\", \"age\": 25}, {\"id\": 2, \"name\": \"李四\", \"age\": 28}, {\"id\": 3, \"name\": \"王五\", \"age\": 22}]";
ObjectMapper objectMapper = new ObjectMapper();
// 指定类型引用,解析为List<User>
List<User> userList = objectMapper.readValue(jsonResponse, new TypeReference<List<User>>() {});
// 遍历处理后的数组数据
for (User user : userList) {
System.out.println("用户ID:" + user.getId() + ",名称:" + user.getName() + ",年龄:" + user.getAge());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}使用Gson解析JSON数组
Gson是Google推出的JSON处理库,使用起来更加简洁,同样在Maven项目中添加依赖:
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version>
</dependency>使用Gson解析上述同样的JSON数组,代码更加简洁:
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.lang.reflect.Type;
import java.util.List;
public class GsonParseDemo {
public static void main(String[] args) {
try {
String jsonResponse = "[{\"id\": 1, \"name\": \"张三\", \"age\": 25}, {\"id\": 2, \"name\": \"李四\", \"age\": 28}, {\"id\": 3, \"name\": \"王五\", \"age\": 22}]";
Gson gson = new Gson();
// 定义目标类型
Type userListType = new TypeToken<List<User>>(){}.getType();
List<User> userList = gson.fromJson(jsonResponse, userListType);
// 遍历数据
for (User user : userList) {
System.out.println("用户ID:" + user.getId() + ",名称:" + user.getName() + ",年龄:" + user.getAge());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}常见问题与处理技巧
空值或缺失字段处理
实际返回的JSON数组中可能存在字段缺失或值为null的情况,可以在实体类中使用@JsonInclude(Jackson)或@SerializedName(Gson)配合默认值处理,也可以在解析后做非空判断:
// Jackson忽略空值字段的实体类配置示例
import com.fasterxml.jackson.annotation.JsonInclude;
@JsonInclude(JsonInclude.Include.NON_NULL)
public class User {
private Integer id;
private String name;
// 年龄字段可能为null,设置默认值
private Integer age = 0;
// 构造方法、getter、setter省略
}异常处理
实际开发中需要处理请求失败、JSON格式错误、字段类型不匹配等异常,建议将解析逻辑放在try-catch块中,针对不同的异常类型做对应的处理,比如重试请求、返回默认数据等。
大数组分页处理
如果REST API返回的JSON数组数据量很大,建议优先使用API自带的分页参数获取部分数据,避免一次性解析大量数据导致内存溢出。如果必须处理全量数据,可以采用流式解析的方式逐步处理数组元素。
JavaREST_APIJSON_arrayJSON_processing修改时间:2026-06-03 16:05:58