Java如何接收JSON数组
- 后端开发
- 2025-07-04
- 3578
在Java中接收JSON数组,通常使用第三方库如Jackson或Gson,通过
ObjectMapper或
Gson将JSON字符串解析为Java对象数组或集合(如
List),
ObjectMapper().readValue(jsonString, new TypeReference(){}),需确保JSON结构与目标类匹配。
在Java中接收JSON数组是前后端交互的常见需求,尤其在RESTful API开发中,以下是详细实现方案,涵盖主流库和实际应用场景:
核心工具库选择
Java解析JSON数组需借助第三方库,推荐两个权威工具:
- Jackson(Spring官方默认库,高性能)
- Gson(Google开发,简洁易用)
依赖引入
Maven配置:
<!-- Jackson -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.0</version>
</dependency>
<!-- Gson -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version>
</dependency>
JSON数组解析实战
场景1:直接解析JSON字符串
假设收到JSON数组:
[
{"id": 1, "name": "产品A"},
{"id": 2, "name": "产品B"}
]
使用Jackson解析:
import com.fasterxml.jackson.databind.ObjectMapper;
String json = "[{"id":1,"name":"产品A"},{"id":2,"name":"产品B"}]";
ObjectMapper mapper = new ObjectMapper();
// 解析为对象数组
Product[] products = mapper.readValue(json, Product[].class);
// 或解析为集合
List<Product> productList = mapper.readValue(json, new TypeReference<List<Product>>(){});
使用Gson解析:
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
String json = "[{"id":1,"name":"产品A"},{"id":2,"name":"产品B"}]";
Gson gson = new Gson();
// 解析为对象数组
Product[] products = gson.fromJson(json, Product[].class);
// 或解析为集合
List<Product> productList = gson.fromJson(json, new TypeToken<List<Product>>(){}.getType());
实体类定义:
public class Product { private int id; private String name; // 必须有无参构造函数 + getter/setter }
场景2:Spring MVC接收HTTP请求中的JSON数组
在Controller中直接映射:
@RestController
public class ProductController {
@PostMapping("/products")
public ResponseEntity<String> addProducts(@RequestBody List<Product> products) {
// Spring自动将JSON数组转为List<Product>
products.forEach(product -> System.out.println(product.getName()));
return ResponseEntity.ok("成功接收" + products.size() + "条数据");
}
}
关键注解:
@RequestBody:自动解析请求体中的JSON数据- 默认使用Jackson,无需手动解析
注意事项与最佳实践
-
字段匹配问题
JSON字段名必须与Java实体类属性名一致(或通过@JsonProperty注解映射)。 -
空值处理
在实体类中使用包装类型(如Integer代替int)避免JSON中null导致NPE。 -
异常捕获
解析时需处理异常:
try { List<Product> products = mapper.readValue(json, new TypeReference<>(){}); } catch (JsonProcessingException e) { throw new RuntimeException("JSON解析失败: " + e.getMessage()); } -
性能优化
- Jackson的
ObjectMapper线程安全,建议复用实例 - 大文件解析用
JsonParser流式API(Jackson)减少内存占用
- Jackson的
-
安全性
禁止解析不可信来源的JSON!攻击者可能构造反面数据消耗资源(如JSON Bomb攻击)。
常见问题排查
-
报错:
UnrecognizedPropertyException
检查JSON字段是否在实体类中存在,或添加注解:@JsonIgnoreProperties(ignoreUnknown = true) // 忽略未知字段 public class Product { ... } -
报错:
InvalidFormatException
JSON数据类型与Java字段类型不匹配(如字符串传入数值字段)。 -
Spring返回415错误
确保HTTP请求头包含Content-Type: application/json。
接收JSON数组的关键步骤:
- 引入Jackson或Gson依赖
- 定义与JSON结构匹配的Java实体类
- 通过库API或Spring注解解析数据
- 添加异常处理和安全性校验
根据项目需求选择工具:
- Spring项目:直接用
@RequestBody+ Jackson(无需手动解析) - 非Spring环境:选Gson(API更简洁)或Jackson(性能更高)
引用说明:本文代码基于Jackson 2.15官方文档和Gson官方指南验证,遵循Java 17语法规范,实体类需遵守JavaBean规范(无参构造 + getter/setter)。

