1. 概述
在本教程中,我們將探討 asText() 與 toString() 在 Jackson 的 JsonNode 中的區別。
JsonNode 類允許解析和操作 JSON 數據。 當與字符串數據交互時,JsonNode 中常用的兩種方法是 asText() 和 toString()。 它們乍一看可能相似,但它們之間存在重要的差異。
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 的數據表示形式。這意味着如果執行此操作,它將返回 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 字符的方式。 asText() 自動轉義文本中的任何特殊字符,例如雙引號和反斜槓,以確保生成的 String 是有效的 JSON。
以下是一個演示 asText() 正確轉義文本中雙引號的方式的示例,而 toString() 不會自動轉義特殊字符。
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 數據。