ObjectMapper在my JSON中显式打印回车和转义引号

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应用程序属性,我被要求保留该属性

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_记录