krl*_*tle 4 regex groovy spring json jackson
被要求修改一个项目以节省控制台和日志文件的空间,该文件具有以下 Spring 应用程序属性,我被要求保留该属性:
spring.jackson.serialization.indent_output=true
Run Code Online (Sandbox Code Playgroud)
显然,这会很好地打印我们所有的 JSON,并在控制台和日志文件中占用大量空间。
该应用程序有一个 groovy 类,它扩展了 Spring 的 OncePerRequestFilter 类,该类捕获 HTTP 请求和响应,并通过屏蔽敏感数据的 groovy 类发送它们。此类有一个接受字符串的方法,该字符串本质上是请求或响应正文的字符串化版本。
一旦字符串被屏蔽,它就会通过 Jackson 的 ObjectMapper 运行,基本上撤消 spring 应用程序属性,使每个打印都漂亮:
代码#1:
return objectMapper.writer().without(SerializationFeature.INDENT_OUTPUT).writeValueAsString(stringToWrite);
Run Code Online (Sandbox Code Playgroud)
下面是一些将通过代码的输入示例:
{
"person" : {
"personName" : "BAR, FOO",
}
}
Run Code Online (Sandbox Code Playgroud)
...结果最终是...
结果#1:
"{\r\n \"person\" : {\r\n \"personName\" : \"BAR, FOO\",\r\n }\r\n }"
Run Code Online (Sandbox Code Playgroud)
...试图采取简单的方法,我认为在字符串上应用一个简单的 .replaceAll() 会消除显式的引号转义符和回车符,但我发现回车符消失了,并且引号转义符又回来了...
代码#2:
return objectMapper.writer().without(SerializationFeature.INDENT_OUTPUT).writeValueAsString(stringToWrite.replaceAll("\\\"", '"').replaceAll("\\r", "").replaceAll("\\n", ""));
Run Code Online (Sandbox Code Playgroud)
结果#2:
"{ \"person\" : { \"personName\" : \"BAR, FOO\" } }"
Run Code Online (Sandbox Code Playgroud)
...最后,如果我只是使用
代码#3
.replaceAll("\\\"", "")
Run Code Online (Sandbox Code Playgroud)
...而不是我在代码 #2 中使用的...
.replaceAll("\\\"", '"')
Run Code Online (Sandbox Code Playgroud)
...然后我得到...
结果#3
"{ person : { personName : BAR, FOO } }"
Run Code Online (Sandbox Code Playgroud)
...但是对我的要求是...
期望的结果:
"{ "person" : { "personName" : "BAR, FOO" } }"
Run Code Online (Sandbox Code Playgroud)
这似乎是 objectMapper 正在使用的某些东西的结果,但此时我有点不知所措。
事实证明你可以设置这个,但这并不明显。可能有更好的方法,但我发现这有效:
DefaultPrettyPrinter p = new DefaultPrettyPrinter();
DefaultPrettyPrinter.Indenter i = new DefaultIndenter(" ", "\n");
p.indentArraysWith(i);
p.indentObjectsWith(i);
mapper.setDefaultPrettyPrinter(p);
String jsonString = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(myObject);
Run Code Online (Sandbox Code Playgroud)