在 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 数据,实现更加灵活和强大的功能。

相关推荐
冷雨夜中漫步4 小时前
Python快速入门(6)——for/if/while语句
开发语言·经验分享·笔记·python
JH30735 小时前
SpringBoot 优雅处理金额格式化:拦截器+自定义注解方案
java·spring boot·spring
m0_736919106 小时前
C++代码风格检查工具
开发语言·c++·算法
Coder_Boy_6 小时前
技术让开发更轻松的底层矛盾
java·大数据·数据库·人工智能·深度学习
2501_944934736 小时前
高职大数据技术专业,CDA和Python认证优先考哪个?
大数据·开发语言·python
invicinble6 小时前
对tomcat的提供的功能与底层拓扑结构与实现机制的理解
java·tomcat
较真的菜鸟6 小时前
使用ASM和agent监控属性变化
java
黎雁·泠崖6 小时前
【魔法森林冒险】5/14 Allen类(三):任务进度与状态管理
java·开发语言
2301_763472467 小时前
C++20概念(Concepts)入门指南
开发语言·c++·算法
TechWJ8 小时前
PyPTO编程范式深度解读:让NPU开发像写Python一样简单
开发语言·python·cann·pypto