JsonNode 中 asText() 和 toString() 的區別
一、概述
在本教程中,我們將探討 Jackson 的JsonNode中asText()和toString()之間的區別。
JsonNode類支持解析和操作 JSON 數據。 JsonNode在與String數據交互時常用的兩個方法是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數據的String表示形式。這意味著如果我們執行此操作,它將返回帶有引號和轉義字符的 JSON 文本表示(包括ObjectNode和ArrayNode的子節點)。
此方法可用於調試或生成可寫入文件、API 等的 JSON 文本。
與asText () 不同,如果我們在 TextNode 上應用toString() TextNode,它將返回一個帶有引號和轉義字符的字符串:
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()不會自動轉義特殊字符。如果我們的 JSON 數據中有特殊字符,使用toString()可能會導致無法正確解析的無效 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\\\" !\"");
六,結論
在本文中,我們討論了在 Java 中處理 JSON 數據的asText () 和toString () 方法。
與往常一樣,代碼在 GitHub 上可用。