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)。
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/45977.html