JSONNode 中的 asText() 與 toString() 區別

Jackson
Remote
1
08:37 PM · Nov 30 ,2025

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 節點,它將返回 truefalse
  • 對於 ArrayNodeObjectNode,它將返回一個空 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 的文本表示形式(包括子節點,在 ObjectNodeArrayNode 的情況下),並帶有引號和轉義字符。

此方法可用於調試或生成可寫入文件、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 數據。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.