被要求修改一个项目以节省控制台和日志文件中的空间,该项目具有以下 Spring 应用程序属性我被要求保留原位:
spring.jackson.serialization.indent_output=true
显然,这会很好地打印我们所有的 JSON 并在控制台和日志文件中占用大量空间。
该应用程序有一个扩展 Spring 的 OncePerRequestFilter 类的 groovy 类,该类获取 HTTP 请求和响应并通过屏蔽敏感数据的 groovy 类发送它们。此类有一个接收字符串的方法,该字符串本质上是请求或响应正文的字符串化版本。
一旦字符串被屏蔽,它就会通过 Jackson 的 ObjectMapper 运行,基本上撤消 spring 应用程序属性,使每个打印都漂亮:
代码#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 使用的结果,但此时我有点不知所措。
最佳答案
原来你可以设置它,但这并不明显。 可能有更好的方法,但我发现这个可行:
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);
关于json - ObjectMapper 在我的 JSON 中显式打印回车符和转义引号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42146372/