当前位置:首页 > 后端开发 > 正文

Java如何接收JSON数组

在Java中接收JSON数组,通常使用第三方库如Jackson或Gson,通过 ObjectMapper或 Gson将JSON字符串解析为Java对象数组或集合(如 List), ObjectMapper().readValue(jsonString, new TypeReference(){}),需确保JSON结构与目标类匹配。

在Java中接收JSON数组是前后端交互的常见需求,尤其在RESTful API开发中,以下是详细实现方案,涵盖主流库和实际应用场景:


核心工具库选择

Java解析JSON数组需借助第三方库,推荐两个权威工具:

  1. Jackson(Spring官方默认库,高性能)
  2. 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解析:

实体类定义

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,无需手动解析


注意事项与最佳实践

  1. 字段匹配问题

    JSON字段名必须与Java实体类属性名一致(或通过@JsonProperty注解映射)。

    Java如何接收JSON数组 第1张

  2. 空值处理

    在实体类中使用包装类型(如Integer代替int)避免JSON中null导致NPE。

  3. 异常捕获

    解析时需处理异常:

    try { List<Product> products = mapper.readValue(json, new TypeReference<>(){}); } catch (JsonProcessingException e) { throw new RuntimeException("JSON解析失败: " + e.getMessage()); }
  4. 性能优化

    • Jackson的ObjectMapper线程安全,建议复用实例
    • 大文件解析用JsonParser流式API(Jackson)减少内存占用
  5. 安全性

    禁止解析不可信来源的JSON!攻破者可能构造恶意数据消耗资源(如JSON Bomb攻破)。


常见问题排查

  • 报错:UnrecognizedPropertyException

    检查JSON字段是否在实体类中存在,或添加注解:

    Java如何接收JSON数组 第2张

    @JsonIgnoreProperties(ignoreUnknown = true) // 忽略未知字段 public class Product { ... }

  • 报错:InvalidFormatException

    JSON数据类型与Java字段类型不匹配(如字符串传入数值字段)。

  • Spring返回415错误

    确保HTTP请求头包含Content-Type: application/json。

  • 接收JSON数组的关键步骤:

    1. 引入Jackson或Gson依赖
    2. 定义与JSON结构匹配的Java实体类
    3. 通过库API或Spring注解解析数据
    4. 添加异常处理和安全性校验

    根据项目需求选择工具:

    • Spring项目:直接用@RequestBody + Jackson(无需手动解析)
    • 非Spring环境:选Gson(API更简洁)或Jackson(性能更高)

    引用说明:本文代码基于Jackson 2.15官方文档Gson官方指南验证,遵循Java 17语法规范,实体类需遵守JavaBean规范(无参构造 + getter/setter)。

    Java如何接收JSON数组 第3张

0