Java中接收和处理JSON数组的实用指南**
在现代Web开发中,JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,被广泛应用于前后端数据交互,Java作为后端开发的主流语言,经常需要处理来自客户端或其他服务的JSON数据,其中JSON数组是一种常见的数据结构,本文将详细介绍在Java中如何接收JSON数组,包括使用标准库和流行第三方库的方法。
JSON数组简介
JSON数组是值的有序集合,用方括号 [] 表示,值之间用逗号分隔,值可以是字符串、数字、布尔值、null、另一个JSON对象或JSON数组。
[
{"name": "张三", "age": 25, "city": "北京"},
{"name": "李四", "age": 30, "city": "上海"},
{"name": "王五", "age": 28, "city": "广州"}
]
这是一个包含三个JSON对象的数组,每个对象代表一个人的信息。
Java接收JSON数组的方法
在Java中接收JSON数组,主要有以下几种途径:
- 使用第三方库(推荐):如Jackson、Gson、Fastjson等,这些库功能强大,使用便捷,是目前的主流选择。
- 使用Java标准库(
javax.json):Java EE 7及以上版本提供了javax.jsonAPI,但在Java SE中需要额外依赖。
下面将重点介绍使用Jackson和Gson这两个最流行的库来接收JSON数组的方法。
使用Jackson库
Jackson是Java生态中最常用的JSON处理库之一。
添加依赖
如果你使用Maven,在pom.xml中添加:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.2</version> <!-- 使用最新版本 -->
</dependency>
接收JSON数组
假设你有一个JSON字符串,表示一个JSON数组,你想将其转换为Java对象的List。
步骤:
a. 定义Java类(POJO):为JSON数组中的每个对象创建对应的Java类。
public class Person {
private String name;
private int age;
private String city;
// 无参构造器、getter和setter方法
public Person() {}
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; }
public String getCity() { return city; }
public void setCity(String city) { this.city = city; }
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", city='" + city + '\'' +
'}';
}
}
b. 使用Jackson进行转换:
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.List;
public class JacksonJsonArrayReceiver {
public static void main(String[] args) throws Exception {
String jsonArrayString = "[" +
"{\"name\":\"张三\",\"age\":25,\"city\":\"北京\"}," +
"{\"name\":\"李四\",\"age\":30,\"city\":\"上海\"}" +
"]";
ObjectMapper objectMapper = new ObjectMapper();
// 将JSON数组字符串转换为List<Person>
// 使用TypeReference来指定泛型类型
List<Person> personList = objectMapper.readValue(jsonArrayString, new TypeReference<List<Person>>() {});
// 输出结果
personList.forEach(System.out::println);
}
}
说明:
ObjectMapper是Jackson的核心类,用于读取和写入JSON。readValue(String content, TypeReference valueType)方法用于将JSON字符串转换为指定类型的Java对象。TypeReference用于处理泛型类型,如List<Person>,因为直接使用List.class会丢失泛型信息。
从HTTP请求体接收JSON数组
在Spring Boot等框架中,控制器方法可以直接接收JSON数组参数:
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
public class PersonController {
@PostMapping("/persons")
public String receivePersonList(@RequestBody List<Person> personList) {
// 处理接收到的personList
personList.forEach(System.out.println);
return "成功接收到 " + personList.size() + " 个人";
}
}
当发送POST请求到/persons,请求体为JSON数组时,Spring Boot会自动使用Jackson将其转换为List<Person>。
使用Gson库
Gson是Google开发的另一个流行的JSON处理库。
添加依赖
Maven依赖:
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version> <!-- 使用最新版本 -->
</dependency>
接收JSON数组
同样,我们需要定义Person类,然后使用Gson进行转换。
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.lang.reflect.Type;
import java.util.List;
public class GsonJsonArrayReceiver {
public static void main(String[] args) {
String jsonArrayString = "[" +
"{\"name\":\"张三\",\"age\":25,\"city\":\"北京\"}," +
"{\"name\":\"李四\",\"age\":30,\"city\":\"上海\"}" +
"]";
Gson gson = new Gson();
// 使用TypeToken来获取正确的List<Person>类型
Type listType = new TypeToken<List<Person>>() {}.getType();
List<Person> personList = gson.fromJson(jsonArrayString, listType);
// 输出结果
personList.forEach(System.out::println);
}
}
说明:
Gson是Gson的核心类。fromJson(String json, Type typeOfT)方法用于将JSON字符串转换为指定类型的Java对象。TypeToken是Gson中用于获取泛型类型的工具类,类似于Jackson的TypeReference。
从HTTP请求体接收JSON数组
在Spring Boot中使用Gson(需要配置,默认是Jackson):
虽然Spring Boot默认使用Jackson,但也可以配置使用Gson,对于@RequestBody,其转换机制与Jackson类似,只要Gson正确配置并注册为JSON转换器即可,通常情况下,开发者更倾向于使用默认的Jackson。
使用Java标准库(javax.json)
如果你使用的是Java EE环境,或者愿意引入javax.json依赖,可以使用它。
添加依赖(对于Java SE)
Maven依赖(使用Jakarta EE API):
<dependency>
<groupId>jakarta.json</groupId>
<artifactId>jakarta.json-api</artifactId>
<version>2.1.1</version>
</dependency>
<!-- 还需要一个实现,如:
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>jakarta.json</artifactId>
<version>2.0.1</version>
</dependency>
-->
接收JSON数组
import jakarta.json.JsonArray;
import jakarta.json.JsonObject;
import jakarta.json.JsonReader;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;
public class JavaxJsonArrayReceiver {
public static void main(String[] args) {
String jsonArrayString = "[" +
"{\"name\":\"张三\",\"age\":25,\"city\":\"北京\"}," +
"{\"name\":\"李四\",\"age\":30,\"city\":\"上海\"}" +
"]";
List<Person> personList = new ArrayList<>();
try (JsonReader reader = Json.createReader(new StringReader(jsonArrayString))) {
JsonArray jsonArray = reader.readArray();
for (int i = 0; i < jsonArray.size(); i++) {
JsonObject jsonObject = jsonArray.getJsonObject(i);
Person person = new Person();
person.setName(jsonObject.getString("name"));
person.setAge(jsonObject.getInt("age"));
person.setCity(jsonObject.getString("city"));
personList.add(person);
}
}
// 输出结果
personList.forEach(System.out::println);
}
}
说明:
JsonReader用于读取JSON数据。readArray()方法将JSON字符串读取为JsonArray。- 然后需要遍历
JsonArray,从每个JsonObject中手动提取数据并填充到Java对象中,这种方式比Jackson和Gson更繁琐,需要更多的手动操作。
最佳实践与注意事项
- 选择合适的库:Jackson和Gson功能强大且成熟,是首选,Jackson在Spring Boot等框架中集成度更高,性能也通常更好。
- 异常处理:JSON字符串格式不正确、缺少字段



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