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 上可用。