Невозможно понять поведение метода ObjectMapper writeValueAsString (значение объекта) - PullRequest
0 голосов
/ 08 мая 2020

Я использую ObjectMapper, чтобы получить значение String из JsonNode, но вижу это странное поведение. Мне что-то здесь не хватает. Может кто-нибудь объяснить, почему в фактическом результате содержится 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.JsonNode и com.fasterxml.jackson.databind.ObjectMapper

Ответы [ 2 ]

0 голосов
/ 09 мая 2020

Вы можете прочитать на json .org , что string это:

Строка представляет собой последовательность из нуля или более символов Unicode, заключенных в двойные кавычки , используя backsla sh escape-символы. Символ представлен в виде односимвольной строки. Строка очень похожа на строку C или Java.

И это то, что делает com.fasterxml.jackson.databind.node.TextNode, заключая {} в двойные кавычки, что дает "{}".

Если вы хотите иметь пустой JSON Object, вы можете создать com.fasterxml.jackson.databind.node.ObjectNode экземпляр:

JsonNode node = mapper.getNodeFactory().objectNode();
0 голосов
/ 08 мая 2020

Согласно документации TextNode - это

/ ** * Узел значения, который содержит текстовое значение. * /

Итак, TextNode оборачивает свой аргумент в "". Чтобы запустить тест, вам нужно либо выбрать другой подкласс Node, либо изменить утверждение на assertEquals("\"{}\"", valueAsString);.

...