目前最主流的 JSON 库是 Google Gson 和 Jackson,我会重点介绍这两个,并简单提及 Java 内置的 org.json 库。

从 JSON 字符串获取 JSONArray
这是最常见的场景,你有一个符合 JSON 格式的字符串,需要将其解析成 JSONArray 对象。
使用 Google Gson
步骤:
- 添加 Gson 依赖。
- 使用
JsonParser将字符串解析成JsonElement。 - 判断
JsonElement是否为JsonArray类型。 - 如果是,则将其强制转换为
JsonArray。
Maven 依赖:
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version> <!-- 建议使用最新版本 -->
</dependency>
代码示例:

import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonParser;
public class GsonGetArrayExample {
public static void main(String[] args) {
// 1. 准备一个JSON字符串
String jsonString = "[\"苹果\", \"香蕉\", \"橙子\", {\"name\": \"张三\", \"age\": 30}]";
// 2. 创建JsonParser实例
JsonParser parser = new JsonParser();
// 3. 解析字符串,得到JsonElement
JsonElement jsonElement = parser.parse(jsonString);
// 4. 检查是否是JsonArray
if (jsonElement.isJsonArray()) {
// 5. 转换为JsonArray
JsonArray jsonArray = jsonElement.getAsJsonArray();
System.out.println("成功获取 JSONArray,长度为: " + jsonArray.size());
// 遍历 JSONArray
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
System.out.println("元素 " + i + " 是一个对象: " + element);
}
}
} else {
System.out.println("输入的字符串不是有效的 JSONArray。");
}
}
}
使用 Jackson
步骤:
- 添加 Jackson 依赖。
- 创建
ObjectMapper实例。 - 使用
ObjectMapper的readValue方法直接将字符串解析成JSONArray的等价物——List<Object>,Jackson 中没有直接的JSONArray类,但List是其核心数据结构。
Maven 依赖:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.2</version> <!-- 建议使用最新版本 -->
</dependency>
代码示例:
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.List;
import java.util.Map;
public class JacksonGetArrayExample {
public static void main(String[] args) {
// 1. 准备一个JSON字符串
String jsonString = "[\"苹果\", \"香蕉\", \"橙子\", {\"name\": \"张三\", \"age\": 30}]";
// 2. 创建ObjectMapper实例
ObjectMapper objectMapper = new ObjectMapper();
try {
// 3. 使用 readValue 方法解析字符串为 List<Object>
// TypeReference 告诉 Jackson 我们期望解析的目标类型是一个泛型 List
List<Object> list = objectMapper.readValue(jsonString, new TypeReference<List<Object>>() {});
System.out.println("成功获取 List (JSONArray的等价物),长度为: " + list.size());
// 遍历 List
for (int i = 0; i < list.size(); i++) {
Object element = list.get(i);
if (element instanceof String) {
// 处理字符串
System.out.println("元素 " + i + ": " + element);
} else if (element instanceof Map) {
// 处理嵌套的 Map (JsonObject的等价物)
System.out.println("元素 " + i + " 是一个对象: " + element);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
使用 Java 内置 org.json 库
这个库非常轻量,无需额外添加依赖(如果你的项目允许使用它,Java EE 或 Jakarta EE 环境中自带)。

代码示例:
import org.json.JSONArray;
import org.json.JSONObject;
public class OrgJsonGetArrayExample {
public static void main(String[] args) {
// 1. 准备一个JSON字符串
String jsonString = "[\"苹果\", \"香蕉\", \"橙子\", {\"name\": \"张三\", \"age\": 30}]";
try {
// 2. 直接使用构造函数创建 JSONArray
JSONArray jsonArray = new JSONArray(jsonString);
System.out.println("成功获取 JSONArray,长度为: " + jsonArray.length());
// 遍历 JSONArray
for (int i = 0; i < jsonArray.length(); i++) {
Object element = jsonArray.get(i);
if (element instanceof String) {
// 处理字符串
System.out.println("元素 " + i + ": " + element);
} else if (element instanceof JSONObject) {
// 处理嵌套的 JSONObject
System.out.println("元素 " + i + " 是一个对象: " + element);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
从 JSON 文件获取 JSONArray
这个场景与从字符串获取非常相似,只是第一步变成了从文件中读取内容。
通用步骤:
- 使用
Files.readString(Java 11+) 或BufferedReader读取文件内容到字符串中。 - 使用上述任一方法(Gson/Jackson/org.json)将字符串解析为
JSONArray。
示例 (使用 Gson):
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonParser;
import java.nio.file.Files;
import java.nio.file.Paths;
public class GetArrayFromFile {
public static void main(String[] args) {
try {
// 1. 从文件读取JSON字符串
String jsonString = Files.readString(Paths.get("data.json"));
// 2. 使用Gson解析
JsonElement jsonElement = JsonParser.parseString(jsonString);
if (jsonElement.isJsonArray()) {
JsonArray jsonArray = jsonElement.getAsJsonArray();
System.out.println("从文件成功读取 JSONArray,长度为: " + jsonArray.size());
// ... 后续处理
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
假设你的 data.json 文件内容如下:
[
"项目A",
"项目B",
{"id": 1, "status": "完成"},
{"id": 2, "status": "进行中"}
]
从 HTTP 响应获取 JSONArray
当你从 API 获取数据时,响应体通常就是 JSON 格式。
通用步骤:
- 使用
HttpURLConnection或更高级的库(如 OkHttp, Apache HttpClient)发送请求并获取输入流。 - 将输入流中的内容读取为字符串。
- 使用上述任一方法将字符串解析为
JSONArray。
示例 (使用 OkHttp 和 Jackson): 添加 OkHttp 依赖:
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.11.0</version> <!-- 建议使用最新版本 -->
</dependency>
代码示例:
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import java.io.IOException;
import java.util.List;
public class GetArrayFromApi {
public static void main(String[] args) {
OkHttpClient client = new OkHttpClient();
String apiUrl = "https://api.example.com/posts"; // 替换成你的API地址
Request request = new Request.Builder()
.url(apiUrl)
.build();
try (Response response = client.newCall(request).execute()) {
if (!response.isSuccessful()) {
throw new IOException("Unexpected code " + response);
}
// 1. 获取响应体的字符串
String responseBody = response.body().string();
// 2. 使用Jackson解析
ObjectMapper objectMapper = new ObjectMapper();
List<Object> list = objectMapper.readValue(responseBody, new TypeReference<List<Object>>() {});
System.out.println("从API成功获取 List,长度为: " + list.size());
// ... 后续处理
} catch (IOException e) {
e.printStackTrace();
}
}
}
总结与选择
| 库 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| Google Gson | API 简洁易用,与 Java Bean 结合紧密,自动序列化/反序列化。 | 性能相对 Jackson 稍弱。 | 需要与 Java 对象(POJO)轻松转换的场景,Android 开发常用。 |
| Jackson | 性能极佳,功能强大(流式 API、树模型、数据绑定),社区活跃,生态完善。 | API 相对 Gson 稍复杂,对于简单解析可能显得“重”。 | 企业级应用,高性能要求的场景,Spring Boot 默认集成。 |
org.json |
轻量级,无需依赖(在标准环境中),API 直观。 | 功能相对简单,性能一般,异常处理不够细致。 | 简单的脚本、工具类,或在不方便引入第三方库的旧项目中。 |
推荐:
- 新项目首选 Jackson:它的性能和全面的功能使其成为事实上的标准。
- 如果项目已在使用或偏好简单 API,Gson 是一个非常优秀的选择。
- 对于极简需求,可以考虑
org.json,但现代项目更倾向于使用功能更强大的第三方库。
