невозможно проанализировать JSON с помощью ObjectMapper Джексона, где значение JSON содержит \\ - PullRequest
1 голос
/ 01 мая 2019

Я сериализую строку json в простой Java-объект, используя класс ObjectMapper Джексона.ObjectMapper генерирует исключение

строка json, которую я пытаюсь десериализовать, это

String input="{\"id\":\"30329\",\"appId\":\"3301\",\"nodeId\":1556537156187,\"data\":\"select id,obt_marks,'\\\\m' as dummy from ltc_test_1\"}";

значение для ключа данных, содержащее \, которое вызывает проблему, это способ избежать этого.я хочу, чтобы это значение было в моем POJO. Оно может работать, заменяя каждое вхождение \ на \\, чтобы строка выглядела как
\ "data \": \ "select id, obt_marks, '\\\\ m' какпустышка из ltc_test_1 \ "

Вопрос: Как этого можно добиться с помощью Java, есть ли какие-либо настройки в objectMapper или Jackson для решения этой проблемы?

Ниже приведено pojo, которое я получу после десериализации

public class WorkflowProcessInfo {
    private Long id;
    private Long appId;
    private Long nodeId;
    private String data;
}

////Code I am using for deserialization 
ObjectMapper mapper = new ObjectMapper();
        mapper.configure(Feature.ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER, false);

        mapper.configure(Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
        mapper.configure(Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true);
        mapper.configure(Feature.ALLOW_SINGLE_QUOTES, true);    mapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY,
                true);

        mapper.setSerializationInclusion(Include.NON_NULL);

        try{
    return mapper.readValue(inputJson, WorkflowProcessInfo.class);
}catch(Exception e){
syso(e.getMessage())}

Я ожидаю, что WorkflowProcessInfo объект со значениями, представленными в значении json, атрибут данных pojo должен выглядеть следующим образом

WorkflowProcessInfo.data="select id,obt_marks,'\\m' as dummy from ltc_test_1"

вместо этого я получаю исключение ниже

com.fasterxml.jackson.core.JsonParseException: Нераспознанный экранирующий символ 'm' (код 109) в [Source: java.io.StringReader@1ea9f6af;строка: 1, столбец: 84]

...