无法理解ObjectMapper writeValueAsString(Object value)方法行为。

我使用的是 ObjectMapper 取值为 StringJsonNode 但看到这种奇怪的行为。我在这里错过了什么。谁能解释一下为什么实际结果有 double quotes 我希望这个测试能通过,但断言失败。

单元测试:

@Test
public void testGetValueAsString() throws JsonProcessingException {
  ObjectMapper fasterXmlMapper = new com.fasterxml.jackson.databind.ObjectMapper();
  JsonNode node = new TextNode("{}");
  String valueAsString = fasterXmlMapper.writeValueAsString(node);
  assertEquals("{}", valueAsString);
}

测试运行输出:

expected:<[{}]> but was:<["{}"]>
Expected :{}
Actual   :"{}"

这里我指的是下面的库和类。

我使用的是 jackson-databind-2.9.9.jar

com.fasterxml.jackson.databind.JsonNodecom.fasterxml.jackson.databind.ObjectMapper

0
投票

根据文档 TextNode

** * 包含文本值的值节点。 *

所以 TextNode 将其参数包装在 "". 为了使你的测试运行,你要么需要选择一个不同的子类的 Node 或将其调整为 assertEquals("\"{}\"", valueAsString);.

0
投票

你可以继续阅读 json.org 该 string 是。

字符串是由0个或多个Unicode字符组成的序列。裹挟 双引号使用反斜杠转义。一个字符被表示为一个单字符字符串。字符串很像一个C或Java字符串。

这就是 com.fasterxml.jackson.databind.node.TextNode 确实,包装 {} 双引号 "{}".

如果你想有一个空的 JSON Object 你可以创造 com.fasterxml.jackson.databind.node.ObjectNode 例如:

JsonNode node = mapper.getNodeFactory().objectNode();