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