杰瑞科技汇

Java中如何获取JSONArray?

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

Java中如何获取JSONArray?-图1
(图片来源网络,侵删)

从 JSON 字符串获取 JSONArray

这是最常见的场景,你有一个符合 JSON 格式的字符串,需要将其解析成 JSONArray 对象。

使用 Google Gson

步骤:

  1. 添加 Gson 依赖。
  2. 使用 JsonParser 将字符串解析成 JsonElement
  3. 判断 JsonElement 是否为 JsonArray 类型。
  4. 如果是,则将其强制转换为 JsonArray

Maven 依赖:

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.10.1</version> <!-- 建议使用最新版本 -->
</dependency>

代码示例:

Java中如何获取JSONArray?-图2
(图片来源网络,侵删)
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

步骤:

  1. 添加 Jackson 依赖。
  2. 创建 ObjectMapper 实例。
  3. 使用 ObjectMapperreadValue 方法直接将字符串解析成 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 环境中自带)。

Java中如何获取JSONArray?-图3
(图片来源网络,侵删)

代码示例:

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

这个场景与从字符串获取非常相似,只是第一步变成了从文件中读取内容。

通用步骤:

  1. 使用 Files.readString (Java 11+) 或 BufferedReader 读取文件内容到字符串中。
  2. 使用上述任一方法(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 格式。

通用步骤:

  1. 使用 HttpURLConnection 或更高级的库(如 OkHttp, Apache HttpClient)发送请求并获取输入流。
  2. 将输入流中的内容读取为字符串。
  3. 使用上述任一方法将字符串解析为 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:它的性能和全面的功能使其成为事实上的标准。
  • 如果项目已在使用或偏好简单 APIGson 是一个非常优秀的选择。
  • 对于极简需求,可以考虑 org.json,但现代项目更倾向于使用功能更强大的第三方库。
分享:
扫描分享到社交APP
上一篇
下一篇