1. 概述
在本教程中,我們將演示如何使用 JSON 指針來瀏覽和從 JSON 數據中檢索信息。
我們還將演示如何執行諸如插入新數據或更新鍵值對等操作。
2. 依賴設置
首先,我們需要將一些依賴項添加到我們的 <em pom.xml</em> 中:
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.json</artifactId>
<version>1.1.2</version>
</dependency>3. JSON 指針
JSON(“JavaScript 對象表示法”)是一種輕量級的數據交換格式,最初由 Douglas Crockford 指定,用於在系統之間交換數據。
雖然它使用 JavaScript 語法,但由於其結果是純文本,因此它具有語言無關性。
JSON 指針 (RFC 6901) 是 JSON 處理 1.1 API (JSR 374) 中的一項特性。它定義了一個 字符串,可用於訪問 JSON 文檔中的值。它與 XPath 在 XML 文檔中的作用類似。
通過使用 JSON 指針,我們可以從 JSON 文件中檢索數據並修改該文件。
4. 訪問數據
我們將通過實現一個名為 JsonPointerCrud 的類,來演示一些操作示例。
假設我們有一個名為 books.json 的 JSON 文件,其內容如下:
{
"library": "My Personal Library",
"books": [
{ "title":"Title 1", "author":"Jane Doe" },
{ "title":"Title 2", "author":"John Doe" }
]
}為了從該文件中訪問數據,我們需要讀取並解析成 JsonStructure 結構。我們可以使用 Json.createReader() 方法來實現,該方法接受一個 InputStream 或 FileReader。
以下是如何執行此操作的方法:
JsonReader reader = Json.createReader(new FileReader("books.json"));
JsonStructure jsonStructure = reader.read();
reader.close();內容將存儲在 JsonStructure 對象中。這是我們用於執行後續操作的對象。
4.1. 從文件中獲取數據
要獲取單個值,我們創建一個 JsonPointer,它指示我們想要獲取值的哪個標籤:
JsonPointer jsonPointer = Json.createPointer("/library");
JsonString jsonString = (JsonString) jsonPointer.getValue(jsonStructure);
System.out.println(jsonString.getString());請注意,此字符串的第一個字符是‘/ – 這是一種語法要求。
結果如下:
My Personal Library要從列表中獲取一個值,我們需要指定其索引(其中第一個索引為 0):
JsonPointer jsonPointer = Json.createPointer("/books/1");
JsonObject jsonObject = (JsonObject) jsonPointer.getValue(jsonStructure);
System.out.println(jsonObject.toString());此輸出結果為:
"title":"Title 2", "author":"John Doe"4.2. 檢查鍵是否存在於文件中
通過 containsValue 方法,我們可以檢查用於創建指針的值是否存在於 JSON 文件中:
JsonPointer jsonPointer = Json.createPointer("/library");
boolean found = jsonPointer.containsValue(jsonStructure);
System.out.println(found);
此片段的結果是:
true4.3. 添加新鍵值對
如果需要向 JSON 添加新值,則 createValue 是負責處理它的方法。 方法 createValue 被重載,以接受 String、int、long、double、BigDecimal 和 BigInteger:
JsonPointer jsonPointer = Json.createPointer("/total");
JsonNumber jsonNumber = Json.createValue(2);
jsonStructure = jsonPointer.add(jsonStructure, jsonNumber);
System.out.println(jsonStructure);再次,我們的輸出是:
{
"library": "My Personal Library",
"total": 2,
"books": [
{ "title":"Title 1", "author":"Jane Doe" },
{ "title":"Title 2", "author":"John Doe" }
]
}4.4. 更新鍵值對
要更新鍵值對,首先需要創建新的鍵值對。創建鍵值對後,使用通過鍵參數創建的指針上的 replace 方法來替換它:
JsonPointer jsonPointer = Json.createPointer("/total");
JsonNumber jsonNumberNewValue = Json.createValue(5);
jsonStructure = jsonPointer.replace(jsonStructure, jsonNumberNewValue);
System.out.println(jsonStructure);輸出:
{
"library": "My Personal Library",
"total": 5,
"books": [
{ "title":"Title 1", "author":"Jane Doe" },
{ "title":"Title 2", "author":"John Doe" }
]
}4.5. 刪除鍵
要刪除鍵,我們首先創建一個指向該鍵的指針。然後,我們使用 remove 方法:
JsonPointer jsonPointer = Json.createPointer("/library");
jsonPointer.getValue(jsonStructure);
jsonStructure = jsonPointer.remove(jsonStructure);
System.out.println(jsonStructure);結果如下:
{
"total": 5,
"books": [
{ "title":"Title 1", "author":"Jane Doe" },
{ "title":"Title 2", "author":"John Doe" }
]
}4.6. 顯示文件的完整內容
如果指針使用一個空字符串創建,則會檢索文件的全部內容:
JsonPointer jsonPointer = Json.createPointer("");
JsonObject jsonObject = (JsonObject) jsonPointer.getValue(jsonStructure);
System.out.println(jsonObject.toString());這段代碼示例將輸出整個 jsonStructure 的內容。
結論
在本文中,我們介紹瞭如何使用 JSON 指針對 JSON 數據執行各種操作。