1. 概述
本教程將探討 Jackson 的 <em>JsonNode</em> 類中 <em>asText()</em> 和 <em>toString()</em> 方法之間的差異。
<em>JsonNode</em> 類允許解析和操作 JSON 數據。當與字符串數據交互時,<em>JsonNode</em> 類中常用的兩種方法是 <em>asText()</em> 和 <em>toString()</em>。 乍一看,它們可能看起來相似,但它們之間存在重要的差異。
2. 依賴項
首先,我們將jackson-databind依賴項添加到 pom.xml
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.14.1</version>
</dependency>3. 使用 asText()
在本文中,我們將使用 Jackson 的 ObjectMapper 對象和 Jackson 的 JsonNode 對象。
asText() 方法返回 JsonNode 的文本值作為 String,但其工作方式取決於 JsonNode 的類型:
- 對於 TextNode,它將返回節點的文本值
- 對於數值節點,它將返回節點的數值值作為 String
- 對於 BooleanNode 節點,它將返回 true 或 false
- 對於 ArrayNode 和 ObjectNode 節點,它將返回一個空 String
asText() 的概念是返回節點的價值,而無需進行任何操作。由於 asText() 是 JsonNode 的抽象方法,所有節點都有一個實現,其中每個節點都返回其自身的價值。
如果無法在不操作節點的情況下返回一個值(例如,由於子節點),它將返回一個空 String:
String json = "{\"name\":\"John\",\"age\":30}";
JsonNode node = new ObjectMapper().readTree(json);
String name = node.get("name").asText();
assertThat(name).isEqualTo("John");
String age = node.get("age").asText();
assertThat(age).isEqualTo("30");
String jsonText = node.asText();
assertThat(jsonText).isEmpty();4. 使用 toString() 方法
`toString() 方法是從 Object 類中繼承的,並返回 JsonNode 數據的一個 String 字符串表示形式。這意味着,如果執行此操作,它將返回 JSON 的文本表示形式(包括子節點,如 ObjectNode 和 ArrayNode 中),並帶有引號和轉義字符。
此方法可用於調試或生成可寫入文件、API 等的 JSON 文本。
與 asText() 方法不同,如果我們在 TextNode 上應用 toString(), 它將返回帶有引號和轉義字符的字符串:
String json = "{\"name\":\"John\",\"age\":30}";
JsonNode node = new ObjectMapper().readTree(json);
String jsonString = node.toString();
assertThat(jsonString).isEqualTo("{\"name\":\"John\",\"age\":30}");
String name = node.get("name").toString();
assertThat(name).isEqualTo("\"John\"");
String age = node.get("age").toString();
assertThat(age).isEqualTo("30");5. 特殊字符
需要考慮的另一個方面是如何處理特殊字符和 Unicode 字符。<em>asText()</em> 會自動轉義文本中的特殊字符,例如雙引號和反斜槓,以確保生成的 <em>String</em> 是有效的 JSON。
以下是一個演示 <em>asText()</em> 正確地轉義文本中雙引號的示例,而 <em>toString()</em> 不會自動轉義特殊字符。如果我們的 JSON 數據中包含特殊字符,使用 <em>toString()</em> 可能會導致無法正確解析的無效 JSON 文本:
String specialCharsJson = "{\"text\":\"Hello \\\"world\\\" !\"}";
JsonNode specialCharsNode = new ObjectMapper().readTree(specialCharsJson);
String specialCharsJsonAsText = specialCharsNode.get("text").asText();
assertThat(specialCharsJsonAsText).isEqualTo("Hello \"world\" !");
String specialCharsJsonToString = specialCharsNode.get("text").toString();
assertThat(specialCharsJsonToString).isEqualTo("\"Hello \\\"world\\\" !\"");6. 結論
在本文中,我們討論了 asText() 和 toString() 方法,用於在 Java 中處理 JSON 數據。