JSONArray 是 Java 中用于表示 JSON 数组(即一个有序的值列表)的对象,它通常与 JSONObject(表示 JSON 对象)一起使用,来处理和生成 JSON 格式的数据。
在 Java 生态中,处理 JSON 的库有很多,其中最流行和主流的是 Google Gson 和 Jackson,Java 标准库从 JDK 11 开始也引入了内置的 javax.json API,下面我将分别介绍这几个库中的 JSONArray。
Google Gson (最常用)
Gson 是 Google 提供的一个开源库,它可以将 Java 对象转换为 JSON 表示,也可以将 JSON 字符串转换为等效的 Java 对象。
核心类
com.google.gson.JsonArray: 表示 JSON 数组。com.google.gson.JsonElement: JSON 的所有元素(对象、数组、字符串、数字等)的基类。com.google.gson.JsonObject: 表示 JSON 对象。com.google.gson.JsonParser: 用于将 JSON 字符串解析为JsonElement。
示例代码
创建 JSONArray
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
public class GsonJsonArrayExample {
public static void main(String[] args) {
// 创建一个空的 JSON 数组
JsonArray jsonArray = new JsonArray();
// 向数组中添加不同类型的元素
jsonArray.add("这是一个字符串");
jsonArray.add(123);
jsonArray.add(45.67);
jsonArray.add(true);
// 创建一个 JSON 对象并添加到数组中
JsonObject person = new JsonObject();
person.addProperty("name", "张三");
person.addProperty("age", 30);
jsonArray.add(person);
// 再添加一个对象
JsonObject person2 = new JsonObject();
person2.addProperty("name", "李四");
person2.addProperty("age", 25);
jsonArray.add(person2);
// 将 JsonArray 转换为格式化的 JSON 字符串
String jsonString = jsonArray.toString();
System.out.println("生成的 JSON 数组:");
System.out.println(jsonString);
}
}
输出:
生成的 JSON 数组:
["这是一个字符串",123,45.67,true,{"name":"张三","age":30},{"name":"李四","age":25}]
解析 JSONArray
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
public class GsonParseJsonArrayExample {
public static void main(String[] args) {
String jsonString = "[\"苹果\", 100, {\"color\": \"red\"}, 150.5]";
// 使用 JsonParser 解析字符串
JsonElement jsonElement = JsonParser.parseString(jsonString);
// 检查并转换为 JsonArray
if (jsonElement.isJsonArray()) {
JsonArray jsonArray = jsonElement.getAsJsonArray();
System.out.println("遍历数组元素:");
// 遍历数组
for (int i = 0; i < jsonArray.size(); i++) {
JsonElement element = jsonArray.get(i);
if (element.isJsonPrimitive()) {
// 如果是基本类型 (字符串, 数字, 布尔值)
System.out.println(" 元素 " + i + ": " + element.getAsString());
} else if (element.isJsonObject()) {
// 如果是对象
JsonObject jsonObject = element.getAsJsonObject();
System.out.println(" 元素 " + i + " (对象): " + jsonObject.get("color").getAsString());
}
}
}
}
}
输出:
遍历数组元素:
元素 0: 苹果
元素 1: 100
元素 2 (对象): red
元素 3: 150.5
Jackson (高性能)
Jackson 是目前 Java 社区中性能最好、功能最强大的 JSON 库之一,它的 API 与 Gson 略有不同。
核心类
com.fasterxml.jackson.databind.JsonNode: Jackson 中所有 JSON 节点的基类,可以表示对象、数组、值等。com.fasterxml.jackson.databind.ObjectMapper: 核心类,用于读取和写入 JSON。com.fasterxml.jackson.databind.node.ArrayNode: 表示 JSON 数节点的具体实现,对应JsonNode。com.fasterxml.jackson.databind.node.ObjectNode: 表示 JSON 对象节点的具体实现。
示例代码
创建 JSONArray (使用 ArrayNode)
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
public class JacksonJsonArrayExample {
public static void main(String[] args) throws Exception {
// 创建 ObjectMapper 实例
ObjectMapper mapper = new ObjectMapper();
// 创建一个 ArrayNode (即 JSON 数组)
ArrayNode jsonArray = mapper.createArrayNode();
// 添加元素
jsonArray.add("香蕉");
jsonArray.add(200);
jsonArray.add(true);
// 创建一个 ObjectNode 并添加到数组中
ObjectNode fruit1 = mapper.createObjectNode();
fruit1.put("name", "西瓜");
fruit1.put("price", 15.8);
jsonArray.add(fruit1);
// 将 ArrayNode 转换为格式化的 JSON 字符串
// 使用 mapper.writerWithDefaultPrettyPrinter() 来美化输出
String jsonString = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(jsonArray);
System.out.println("生成的 JSON 数组:");
System.out.println(jsonString);
}
}
输出:
生成的 JSON 数组:
[
"香蕉",
200,
true,
{
"name" : "西瓜",
"price" : 15.8
}
]
解析 JSONArray (使用 JsonNode)
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonParseJsonArrayExample {
public static void main(String[] args) throws Exception {
String jsonString = "[\"橘子\", 80, {\"origin\": \"China\"}]";
ObjectMapper mapper = new ObjectMapper();
// 将 JSON 字符串解析为 JsonNode
JsonNode jsonNode = mapper.readTree(jsonString);
// 检查是否为数组
if (jsonNode.isArray()) {
System.out.println("遍历数组元素:");
// 使用 for 循环遍历数组
for (JsonNode element : jsonNode) {
if (element.isTextual()) {
System.out.println(" 元素: " + element.asText());
} else if (element.isObject()) {
JsonNode originNode = element.get("origin");
System.out.println(" 元素 (对象): " + originNode.asText());
} else if (element.isInt()) {
System.out.println(" 元素 (数字): " + element.asInt());
}
}
}
}
}
输出:
遍历数组元素:
元素: 橘子
元素 (数字): 80
元素 (对象): China
Java 标准库 (javax.json - Jakarta JSON)
从 Java EE 8 开始,标准库中引入了 javax.json API(在 Jakarta EE 9+ 中,包名变为 jakarta.json),如果你使用的是 Jakarta EE 环境(如 Jakarta EE 8/9/10 服务器),可以直接使用它,无需额外依赖。
核心类
javax.json.JsonArray: 表示 JSON 数组。javax.json.JsonObject: 表示 JSON 对象。javax.json.JsonReader: 用于读取 JSON。javax.json.JsonWriter: 用于写入 JSON。javax.json.JsonReaderFactory/JsonWriterFactory: 工厂类。
示例代码
创建 JSONArray
import javax.json.Json;
import javax.json.JsonArray;
import javax.json.JsonArrayBuilder;
import javax.json.JsonObject;
import javax.json.JsonObjectBuilder;
public class JavaxJsonArrayExample {
public static void main(String[] args) {
// 使用 JsonArrayBuilder 来构建数组
JsonArrayBuilder arrayBuilder = Json.createArrayBuilder();
arrayBuilder.add("葡萄")
.add(300)
.add(false);
// 创建一个 JsonObject 并添加到数组中
JsonObjectBuilder objectBuilder = Json.createObjectBuilder();
objectBuilder.add("name", "草莓");
objectBuilder.add("isSweet", true);
JsonObject strawberry = objectBuilder.build();
arrayBuilder.add(strawberry);
// 构建 JsonArray
JsonArray jsonArray = arrayBuilder.build();
// 使用 JsonWriter 写入到控制台
System.out.println("生成的 JSON 数组:");
Json.createWriter(System.out).writeArray(jsonArray);
}
}
输出:
生成的 JSON 数组:
["葡萄",300,false,{"name":"草莓","isSweet":true}]
解析 JSONArray
import javax.json.Json;
import javax.json.JsonArray;
import javax.json.JsonObject;
import javax.json.JsonReader;
import java.io.StringReader;
public class JavaxParseJsonArrayExample {
public static void main(String[] args) {
String jsonString = "[\"芒果\", 250, {\"taste\": \"sweet\"}]";
// 使用 try-with-resources 确保 JsonReader 关闭
try (JsonReader reader = Json.createReader(new StringReader(jsonString))) {
JsonArray jsonArray = reader.readArray();
System.out.println("遍历数组元素:");
for (int i = 0; i < jsonArray.size(); i++) {
if (jsonArray.getJsonString(i) != null) {
System.out.println(" 元素 " + i + ": " + jsonArray.getJsonString(i).getString());
} else if (jsonArray.getJsonNumber(i) != null) {
System.out.println(" 元素 " + i + ": " + jsonArray.getJsonNumber(i).intValue());
} else if (jsonArray.getJsonObject(i) != null) {
JsonObject obj = jsonArray.getJsonObject(i);
System.out.println(" 元素 " + i + " (对象): " + obj.getString("taste"));
}
}
}
}
}
输出:
遍历数组元素:
元素 0: 芒果
元素 1: 250
元素 2 (对象): sweet
总结与对比
| 特性 | Google Gson | Jackson | Java (javax.json) |
|---|---|---|---|
| 易用性 | 非常简单,API 直观,适合快速上手。 | 功能强大,但 API 相对复杂一些。 | API 设计良好,但不如 Gson 简洁。 |
| 性能 | 性能良好,但在极端大数据量下不如 Jackson。 | 性能极高,是业界公认最快的 JSON 库之一。 | 性能中等,适合一般应用。 |
| 依赖 | 需要添加 gson 库。 |
需要添加 jackson-databind 等库。 |
Java EE 8+ / Jakarta EE 9+ 标准库,无需额外依赖(如果环境支持)。 |
| 主要特点 | 简洁、易用,与 Java Bean 结合紧密。 | 功能全面,支持流式 API、数据绑定等,生态最完善。 | 标准化,适合在 Java EE 环境中避免引入第三方库。 |
| 适用场景 | 中小型项目、快速原型开发、对性能要求不是极端的场景。 | 大型项目、高性能要求的场景、Spring Boot 等框架的默认选择。 | 企业级 Java 应用(EE 环境)、不想引入第三方依赖的项目。 |
如何选择?
- 新手或快速开发:推荐 Gson,API 简单,学习成本低。
- 生产环境、高性能需求:推荐 Jackson,性能和功能都是顶级的,是事实上的行业标准。
- 在 Java EE / Jakarta EE 项目中:可以直接使用
javax.json,保持项目纯净,但如果项目已经使用了 Spring Boot,Spring Boot 默认集成了 Jackson,直接使用会更方便。
