2017-02-09 5 views
0

Просили изменить проект, чтобы сэкономить место в нашей консоли и файлы журналов, которые имеют следующее свойство приложения Spring: , которого меня попросили оставить на месте:ObjectMapper явно печатает возврат каретки и экранирование кавычек в моем JSON

spring.jackson.serialization.indent_output=true 

Очевидно, что это будет довольно напечатать все наши JSON и занимают массу пространства в консоли и файлы журналов.

Приложение имеет класс groovy, который расширяет класс SpringPayRequestFilter Spring, который захватывает HTTP-запросы и ответы и отправляет их через класс groovy, который маскирует конфиденциальные данные. Этот класс имеет метод, который принимает строку, которая по существу является строковой версией тела запроса или ответа.

После того, как строка была замаскирована, она проходит через ObjectMapper Джексона в основном отменить свойство пружины приложения, чтобы сделать каждую печать довольно:

код # 1:

return objectMapper.writer().without(SerializationFeature.INDENT_OUTPUT).writeValueAsString(stringToWrite); 

Вот несколько примеров который будет проходить через код:

{ 
    "person" : { 
    "personName" : "BAR,  FOO", 
    } 
} 

... и результат заканчивается ...

Результат # 1:

"{\r\n \"person\" : {\r\n \"personName\" : \"BAR,  FOO\",\r\n }\r\n }" 

... пытается взять легкий путь, я понял, применяя простой .replaceAll() на строке будет выбивать явные цитаты и побеги возврата каретки , но я обнаружил, что возврат каретки исчез и что цитата ускользает просто прийти обратно ...

код # 2:

return objectMapper.writer().without(SerializationFeature.INDENT_OUTPUT).writeValueAsString(stringToWrite.replaceAll("\\\"", '"').replaceAll("\\r", "").replaceAll("\\n", "")); 

Результат # 2:

"{ \"person\" : { \"personName\" : \"BAR,  FOO\" } }" 

... и, наконец, если я просто использовать

Код # 3

.replaceAll("\\\"", "") 

... вместо того, что я использовал в Код № 2, который был ...

.replaceAll("\\\"", '"') 

... тогда я получаю ...

Результат # 3

"{ person : { personName : BAR,  FOO } }" 

... но то, что от меня ...

Желаемый результат:

"{ "person" : { "personName" : "BAR,  FOO" } }" 

Это, как представляется, является результатом чем-то ObjectMapper использует, но я немного в растерянности в этой точке.

+0

Что происходит, когда вы печатаете его? 'println result' –

+0

@tim_yates - если я печатаю строку stringToWrite с помощью .replaceAll (" \\\ "", ""), тогда мой желаемый результат печатается на консоль. Это обходит стратегию логарифма процесса, которая в настоящее время подает как консоль, так и файл журнала. – krlittle

+0

Создает для вас объекты для JSON? @broken_records – Coder

ответ

0

Оказывается, я мог бы просто удалить ObjectMapper полностью, чтобы получить нужный мне результат:

stringToWrite.replaceAll("\\\"", '"').replaceAll("\\r", "").replaceAll("\\n", "") 
Смежные вопросы