在 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 数据的类和接口,包括 JsonObject、JsonArray、JsonReader、JsonWriter 等。

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 还支持嵌套结构。我们可以使用 getJsonObject 和 getJsonArray 方法来处理复杂的 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 数据,实现更加灵活和强大的功能。

相关推荐
Liquad Li4 分钟前
Salesforce 主流认证方式、流程、适用场景
开发语言·salesforce
LOVE️YOU3 小时前
Python 中 Tuple 为什么有时可 Hash,有时不可 Hash?
开发语言·python·哈希算法
ym hyd 1113 小时前
试题库管理系统源码 Java+SpringBoot+Vue3 前后分离
java·vue.js·spring boot·毕设
李永奉3 小时前
C语言-指针函数与函数指针及回调函数的使用
c语言·开发语言
小oo呆3 小时前
【学习心得】迭代器和可迭代对象
开发语言·python
AC赳赳老秦4 小时前
采集行为合规自检:OpenClaw 自动校验 robots 协议与采集频率,规避违规采集风险
java·开发语言·c++·python·php·deepseek·openclaw
钱栈up4 小时前
mvn compile 卡死在 javac 阶段:一次类型不匹配的排查与修复
java·开发语言
迅猛龙办公室4 小时前
Python输出当前计算机的系统日期和时间
开发语言·前端·python
杨丰玮4184 小时前
C语言基础知识(一)————各类符号的含义与输入输出库(stdio)
c语言·开发语言
程序猿编码5 小时前
工业视觉多任务方案:可编程梯度信息视觉框架,训练评估 + C++ 部署完整实战
开发语言·c++·视觉·推理引擎