ObjectMapper在my JSON中显式打印回车和转义引号
我被要求修改一个项目以节省控制台和日志文件中的空间,这些文件具有以下Spring应用程序属性,我被要求保留该属性:ObjectMapper在my JSON中显式打印回车和转义引号,json,regex,spring,groovy,jackson,Json,Regex,Spring,Groovy,Jackson,我被要求修改一个项目以节省控制台和日志文件中的空间,这些文件具有以下Spring应用程序属性,我被要求保留该属性: spring.jackson.serialization.indent_output=true 显然,这将相当于打印我们所有的JSON,并在控制台和日志文件中占用大量空间 该应用程序有一个groovy类,它扩展了Spring的OncePerRequestFilter类,该类捕获HTTP请求和响应,并通过屏蔽敏感数据的groovy类发送它们。该类有一个方法,该方法接收一个字符串,该
spring.jackson.serialization.indent_output=true
显然,这将相当于打印我们所有的JSON,并在控制台和日志文件中占用大量空间
该应用程序有一个groovy类,它扩展了Spring的OncePerRequestFilter类,该类捕获HTTP请求和响应,并通过屏蔽敏感数据的groovy类发送它们。该类有一个方法,该方法接收一个字符串,该字符串本质上是请求或响应主体的字符串化版本
一旦字符串被屏蔽,它将通过Jackson的ObjectMapper运行,基本上撤消spring应用程序属性,以使每个打印变得漂亮:
代码#1:
return objectMapper.writer().without(SerializationFeature.INDENT_OUTPUT).writeValueAsString(stringToWrite);
"{\r\n \"person\" : {\r\n \"personName\" : \"BAR, FOO\",\r\n }\r\n }"
return objectMapper.writer().without(SerializationFeature.INDENT_OUTPUT).writeValueAsString(stringToWrite.replaceAll("\\\"", '"').replaceAll("\\r", "").replaceAll("\\n", ""));
"{ \"person\" : { \"personName\" : \"BAR, FOO\" } }"
下面是一些将在代码中使用的示例输入:
{
"person" : {
"personName" : "BAR, FOO",
}
}
。。。结果是
结果#1:
return objectMapper.writer().without(SerializationFeature.INDENT_OUTPUT).writeValueAsString(stringToWrite);
"{\r\n \"person\" : {\r\n \"personName\" : \"BAR, FOO\",\r\n }\r\n }"
return objectMapper.writer().without(SerializationFeature.INDENT_OUTPUT).writeValueAsString(stringToWrite.replaceAll("\\\"", '"').replaceAll("\\r", "").replaceAll("\\n", ""));
"{ \"person\" : { \"personName\" : \"BAR, FOO\" } }"
。。。为了简单地解决这个问题,我想在字符串上应用一个简单的.replaceAll()可以去掉显式的引号转义和回车,但是我发现回车消失了,引号转义正好回来
代码#2:
return objectMapper.writer().without(SerializationFeature.INDENT_OUTPUT).writeValueAsString(stringToWrite);
"{\r\n \"person\" : {\r\n \"personName\" : \"BAR, FOO\",\r\n }\r\n }"
return objectMapper.writer().without(SerializationFeature.INDENT_OUTPUT).writeValueAsString(stringToWrite.replaceAll("\\\"", '"').replaceAll("\\r", "").replaceAll("\\n", ""));
"{ \"person\" : { \"personName\" : \"BAR, FOO\" } }"
结果#2:
return objectMapper.writer().without(SerializationFeature.INDENT_OUTPUT).writeValueAsString(stringToWrite);
"{\r\n \"person\" : {\r\n \"personName\" : \"BAR, FOO\",\r\n }\r\n }"
return objectMapper.writer().without(SerializationFeature.INDENT_OUTPUT).writeValueAsString(stringToWrite.replaceAll("\\\"", '"').replaceAll("\\r", "").replaceAll("\\n", ""));
"{ \"person\" : { \"personName\" : \"BAR, FOO\" } }"
。。。最后,如果我使用
代码#3
.replaceAll("\\\"", "")
"{ person : { personName : BAR, FOO } }"
。。。而不是我在代码#2中使用的
.replaceAll("\\\"", '"')
。。。然后我得到
结果#3
.replaceAll("\\\"", "")
"{ person : { personName : BAR, FOO } }"
。。。但对我的要求是
所需结果:
"{ "person" : { "personName" : "BAR, FOO" } }"
这似乎是objectMapper正在使用的某些东西的结果,但我现在有点不知所措。事实证明,我认为这是objectMapper的问题,使整个情况变得复杂。相反,我的自定义OncePerRequestFilter正在记录我的自定义javax.servlet.http.HttpServletRequestWrapper的requestBody,它是一个字节[]转换为字符串,因此我所需要的只是替换UTF-8编码的显式返回框和换行符:
stringToWrite.replaceAll("\\r", "").replaceAll("\\n", "")
事实证明你可以设置这个,但这并不明显。
也许有更好的方法,但我发现这很有效:
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);
打印出来时会发生什么
println result
@tim_-yates-如果我使用.replaceAll(“\\\\”,“”)只打印stringToWrite,那么我想要的结果会打印到控制台。这会绕过进程的回写策略,而回写策略是当前为控制台和日志文件提供信息的。为JSON构建对象是您的一个选项吗?@breaked_记录