杰瑞科技汇

Java中JSONArray如何使用?

JSONArray 是 Java 中用于表示 JSON 数组(即一个有序的值列表)的对象,它通常与 JSONObject(表示 JSON 对象)一起使用,来处理和生成 JSON 格式的数据。

在 Java 生态中,处理 JSON 的库有很多,其中最流行和主流的是 Google GsonJackson,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,直接使用会更方便。
分享:
扫描分享到社交APP
上一篇
下一篇