Почему ObjectNode добавляет обратную косую черту в строку Json

Вот как я пытаюсь преобразовать объект в json String

    ObjectNode batch = OBJECT_MAPPER.createObjectNode();
    String s = OBJECT_MAPPER.writeValueAsString((triggerCommands.getCommands()));
    batch.put("commands", s);
    System.out.println("raw String= " + s);
    System.out.println("ObjectNode String = " + batch);

Что приводит к выводу;

raw String= [{"cmdid":"a06c00d4-5b8b-4313-a8f3-5663dde0fa5b","type":"test"}]

ObjectNode String = {"commands":"[{\"cmdid\":\"a06c00d4-5b8b-4313-a8f3-5663dde0fa5b\",\"type\":\"test\"}]"}

Мне любопытно узнать, почему строка получает обратную косую черту, когда я добавляю ее в качестве значения ObjectNode. Все, что я хочу, это

ObjectNode String = {"commands":[{"cmdid":"a06c00d4-5b8b-4313-a8f3-5663dde0fa5b","type":"test"}]}

Аналогичный вопрос задан здесь, но на него нет надежного ответа.


person Anum Sheraz    schedule 18.09.2018    source источник
comment
Поскольку в строке JSON необходимо экранировать двойные кавычки. Вы хотите, чтобы значение свойства commands было массивом JSON, а не строкой.   -  person JB Nizet    schedule 19.09.2018


Ответы (2)


Поскольку вы работаете в домене JsonNode, вы хотите, чтобы Джексон преобразовал ваши команды в JsonNode, а не в String. Как это:

ObjectNode batch = OBJECT_MAPPER.createObjectNode();
JsonNode commands = OBJECT_MAPPER.valueToTree(triggerCommands.getCommands());
batch.set("commands", commands);
person dnault    schedule 18.09.2018

Я только что прочитал некоторые исходные коды toString() метода класса ObjectNode, вызывает TextNode.appendQuoted, а затем статический метод CharTypes.appendQuoted(StringBuilder sb, String content), это добавляет ( " ), когда объект записывается toString(), здесь.. когда найден символ ", тогда он добавляет обратную реакцию. Поскольку ваш ключ (и) представляет собой массив объектов, если вы проверите реализацию ObjectNode.put, это не позволит вам добавить ключ в виде массива, поэтому его необходимо проанализировать до String

Обратите внимание, что вы этого не получите.

ObjectNode String = {"commands":[{"cmdid":"a06c00d4-5b8b-4313-a8f3-5663dde0fa5b","type":"test"}]}

потому что ключ не находится между " (кавычки) и, как я сказал, ObjectNode не позволяет вам использовать ключ типа array.

person David Benavides    schedule 18.09.2018