在 Java 中只用 JDK 自带的类库解析 JSON

在 Java 中,解析 JSON(JavaScript Object Notation)是一项常见的任务,它允许我们在应用程序中处理和交换数据。虽然 Java 标准库中没有提供专门用于 JSON 解析的类,但是可以使用 JDK 自带的类库以及第三方库来完成这项任务。

1. 了解 JSON

JSON 是一种轻量级的数据交换格式,易于阅读和编写。它由键值对组成,数据以键值对的形式存储,键和值之间用冒号分隔,每对键值对之间用逗号分隔,数据由大括号 {} 包围。

例如,一个简单的 JSON 数据如下所示:

java 复制代码
{
  "name": "John Doe",
  "age": 30,
  "city": "New York"
}

2. 使用 JDK 自带的类库解析 JSON

在 Java 中,我们可以使用 JDK 自带的类库 javax.json 来解析 JSON 数据。javax.json 包含了一组用于处理 JSON 数据的类和接口,包括 JsonObjectJsonArrayJsonReaderJsonWriter 等。

2.1 创建 JSON 解析器(JsonParser)
java 复制代码
import javax.json.Json;
import javax.json.JsonObject;
import javax.json.JsonReader;
import java.io.StringReader;

public class JsonParserExample {
    public static void main(String[] args) {
        // JSON 字符串
        String jsonString = "{\"name\":\"John Doe\",\"age\":30,\"city\":\"New York\"}";

        // 创建 JsonReader 对象
        JsonReader jsonReader = Json.createReader(new StringReader(jsonString));

        // 从 JsonReader 中读取 JsonObject
        JsonObject jsonObject = jsonReader.readObject();

        // 关闭 JsonReader
        jsonReader.close();

        // 输出解析后的 JsonObject
        System.out.println("Name: " + jsonObject.getString("name"));
        System.out.println("Age: " + jsonObject.getInt("age"));
        System.out.println("City: " + jsonObject.getString("city"));
    }
}
2.2 解析 JSON 数组(JsonArray)
java 复制代码
import javax.json.Json;
import javax.json.JsonArray;
import javax.json.JsonReader;
import java.io.StringReader;

public class JsonArrayParserExample {
    public static void main(String[] args) {
        // JSON 数组字符串
        String jsonArrayString = "[\"apple\", \"banana\", \"orange\"]";

        // 创建 JsonReader 对象
        JsonReader jsonReader = Json.createReader(new StringReader(jsonArrayString));

        // 从 JsonReader 中读取 JsonArray
        JsonArray jsonArray = jsonReader.readArray();

        // 关闭 JsonReader
        jsonReader.close();

        // 输出解析后的 JsonArray
        for (int i = 0; i < jsonArray.size(); i++) {
            System.out.println(jsonArray.getString(i));
        }
    }
}
2.3 处理复杂的 JSON 结构

除了简单的键值对和数组外,JSON 还支持嵌套结构。我们可以使用 getJsonObjectgetJsonArray 方法来处理复杂的 JSON 结构。

java 复制代码
import javax.json.Json;
import javax.json.JsonObject;
import javax.json.JsonReader;
import java.io.StringReader;

public class NestedJsonParserExample {
    public static void main(String[] args) {
        // 嵌套的 JSON 字符串
        String nestedJsonString = "{\"person\":{\"name\":\"John Doe\",\"age\":30,\"address\":{\"city\":\"New York\",\"country\":\"USA\"}}}";

        // 创建 JsonReader 对象
        JsonReader jsonReader = Json.createReader(new StringReader(nestedJsonString));

        // 从 JsonReader 中读取 JsonObject
        JsonObject jsonObject = jsonReader.readObject();

        // 关闭 JsonReader
        jsonReader.close();

        // 获取嵌套的 JsonObject
        JsonObject personObject = jsonObject.getJsonObject("person");

        // 输出解析后的结果
        System.out.println("Name: " + personObject.getString("name"));
        System.out.println("Age: " + personObject.getInt("age"));

        // 获取嵌套的 JsonObject
        JsonObject addressObject = personObject.getJsonObject("address");
        System.out.println("City: " + addressObject.getString("city"));
        System.out.println("Country: " + addressObject.getString("country"));
    }
}

3. 使用示例

接下来,我们将使用一个更复杂的 JSON 数据示例,并使用上述代码解析它。

java 复制代码
{
  "name": "John Doe",
  "age": 30,
  "address": {
    "city": "New York",
    "country": "USA"
  },
  "languages": ["Java", "JavaScript", "Python"]
}
java 复制代码
import javax.json.Json;
import javax.json.JsonArray;
import javax.json.JsonObject;
import javax.json.JsonReader;
import java.io.StringReader;

public class ComplexJsonParserExample {
    public static void main(String[] args) {
        // 复杂的 JSON 字符串
        String complexJsonString = "{\"name\":\"John Doe\",\"age\":30,\"address\":{\"city\":\"New York\",\"country\":\"USA\"},\"languages\":[\"Java\",\"JavaScript\",\"Python\"]}";

        // 创建 JsonReader 对象
        JsonReader jsonReader = Json.createReader(new StringReader(complexJsonString));

        // 从 JsonReader 中读取 JsonObject
        JsonObject jsonObject = jsonReader.readObject();

        // 关闭 JsonReader
        jsonReader.close();

        // 输出解析后的结果
        System.out.println("Name: " + jsonObject.getString("name"));
        System.out.println("Age: " + jsonObject.getInt("age"));

        // 获取嵌套的 JsonObject
        JsonObject addressObject = jsonObject.getJsonObject("address");
        System.out.println("City: " + addressObject.getString("city"));
        System.out.println("Country: " + addressObject.getString("country"));

        // 获取 JsonArray
        JsonArray languagesArray = jsonObject.getJsonArray("languages");
        System.out.println("Languages:");
        for (int i = 0; i < languagesArray.size(); i++) {
            System.out.println(" - " + languagesArray.getString(i));
        }
    }
}

本文详细介绍了如何使用 JDK 自带的类库 javax.json 来解析 JSON 数据。通过创建 JsonReader 对象并读取 JSON 数据,可以轻松地将 JSON 字符串解析为 Java 对象,从而在应用程序中进行进一步处理和操作。此外,还介绍了如何处理复杂的 JSON 结构,包括嵌套的对象和数组。通过学习和掌握这些技术,可以在 Java 应用程序中方便地处理 JSON 数据,实现更加灵活和强大的功能。

相关推荐
雨中飘荡的记忆1 天前
ElasticJob分布式调度从入门到实战
java·后端
考虑考虑1 天前
JDK25模块导入声明
java·后端·java ee
_小马快跑_1 天前
Java 的 8 大基本数据类型:为何是不可或缺的设计?
java
Re_zero1 天前
线上日志被清空?这段仅10行的 IO 代码里竟然藏着3个毒瘤
java·后端
洋洋技术笔记1 天前
Spring Boot条件注解详解
java·spring boot
程序员清风2 天前
程序员兼职必看:靠谱软件外包平台挑选指南与避坑清单!
java·后端·面试
皮皮林5512 天前
利用闲置 Mac 从零部署 OpenClaw 教程 !
java
华仔啊3 天前
挖到了 1 个 Java 小特性:var,用完就回不去了
java·后端
SimonKing3 天前
SpringBoot整合秘笈:让Mybatis用上Calcite,实现统一SQL查询
java·后端·程序员
日月云棠3 天前
各版本JDK对比:JDK 25 特性详解
java