1. 概述

在这个教程中,我们将探讨Jackson的JsonNode类中asText()toString()方法的区别。

JsonNode类允许我们解析和操作JSON数据。在与字符串数据交互时,JsonNode的两种常用方法是asText()toString()。乍看起来它们相似,但其实有重要的不同点。

2. 依赖项

首先,让我们在pom.xml文件中添加jackson-databind依赖:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.14.1</version>
</dependency>

3. 使用asText()

本文将使用jackson-object-mapper对象和jackson-json-to-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数据的String表示形式。这意味着如果我们执行此操作,它将返回带有引号和转义字符的JSON文本表示(对于ObjectNodeArrayNode,包括子节点)。

这个方法在调试或生成可以写入文件、API等的JSON文本时很有用。

asText()不同,如果我们对TextNode应用toString(),它会返回带有引号和转义字符的String

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\\\" !\"");

6. 总结

本文讨论了在Java中处理JSON数据时的asText()toString()方法。

如往常一样,代码可以在GitHub上找到。