小编krl*_*tle的帖子

ObjectMapper 在我的 JSON 中显式打印回车符和转义引号

被要求修改一个项目以节省控制台和日志文件的空间,该文件具有以下 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)

regex groovy spring json jackson

4
推荐指数
1
解决办法
1万
查看次数

标签 统计

groovy ×1

jackson ×1

json ×1

regex ×1

spring ×1