Java 如何防止Jackson输出漂亮的打印JSON?
我想确保Jackson生成的JSON文件永远不会被打印出来。我是一名初级工程师,正在从事一个已经存在的项目,因此我需要反向工作,以找到所有可以将JSON配置为以漂亮打印输出的方法。我可以确认项目中有0个对.defaultPrettyPrintingWriter()的引用,还有0个对.setSerializationConfig的引用,我相信这也可以用于启用漂亮打印Java 如何防止Jackson输出漂亮的打印JSON?,java,json,jackson,Java,Json,Jackson,我想确保Jackson生成的JSON文件永远不会被打印出来。我是一名初级工程师,正在从事一个已经存在的项目,因此我需要反向工作,以找到所有可以将JSON配置为以漂亮打印输出的方法。我可以确认项目中有0个对.defaultPrettyPrintingWriter()的引用,还有0个对.setSerializationConfig的引用,我相信这也可以用于启用漂亮打印 那么这还有什么可能呢?或者,是否有可靠的方法来确保JSON文件不漂亮打印?不确定您使用的是哪个版本的Jackson,但在最新版本(1
那么这还有什么可能呢?或者,是否有可靠的方法来确保JSON文件不漂亮打印?不确定您使用的是哪个版本的Jackson,但在最新版本(1.9.10)中,JsonGenerator的默认行为是不漂亮打印。打开它最简单的方法是调用
generator.useDefaultPrettyPrinter()
或generator.setPrettyPrinter(新的DefaultPrettyPrinter())
。尝试搜索useDefaultPrettyPrinter
和setPrettyPrinter
并删除这些语句。取决于您使用的Spring版本映射JacksonHttpMessageConverterr应具有名为prettyPrint
的布尔属性,以便在序列化JSON时配置打印机
因此,这个XML配置应该可以做到这一点(如果您使用的是最新版本的Spring3)
您可以在github上看到介绍该属性的。类的属性,包括这个属性。最后,这是与上一次提交相关的Spring Jira问题
或者您可以尝试将您的Jackson版本更新为更新的版本,其中包括Alexander Ryzhov提到的
useDefaultPrettyPrinter
和setPrettyPrinter
方法。最优雅的解决方案是将漂亮/不漂亮的切换放入过滤器中,并重用静态配置对象。这可以防止无用的垃圾收集
/**
* Evaluate the "pretty" query parameter. If given without any value, or with "true": pretty JSON output.
* E.g. /test?pretty or /test?pretty=true
* Otherwise output without any formatting.
*
* @see https://stackoverflow.com/questions/10532217/jax-rs-json-pretty-output
*/
@Provider
@Produces(MediaType.APPLICATION_JSON)
public class RestPrettyJsonFilter implements ContainerResponseFilter {
public static final String QUERYPARAM_PRETTY = "pretty";
private static final IndentingModifier INDENTING_MODIFIER_PRETTY = new IndentingModifier(true);
private static final IndentingModifier INDENTING_MODIFIER_NOT_PRETTY = new IndentingModifier(false);
@Override
public void filter(ContainerRequestContext reqCtx, ContainerResponseContext respCtx) throws IOException {
boolean pretty = false;
UriInfo uriInfo = reqCtx.getUriInfo();
//log.info("prettyFilter: "+uriInfo.getPath());
MultivaluedMap<String, String> queryParameters = uriInfo.getQueryParameters();
if(queryParameters.containsKey(QUERYPARAM_PRETTY)) {
// Pretty query parameter is present
String prettyParam = queryParameters.getFirst(QUERYPARAM_PRETTY);
// Pretty is present without any value, or value is set to "true"?
if (prettyParam == null || "".equals(prettyParam) || "true".equals(prettyParam)) {
pretty = true;
}
}
// Prevent recreation of objects over and over again
//ObjectWriterInjector.set(new IndentingModifier(pretty));
if (pretty) {
ObjectWriterInjector.set(INDENTING_MODIFIER_PRETTY);
} else {
ObjectWriterInjector.set(INDENTING_MODIFIER_NOT_PRETTY);
}
}
/**
* Used to switch on / off pretty output for each response.
*/
public static class IndentingModifier extends ObjectWriterModifier {
private final boolean indent;
/** Minimal pretty printer is not printing pretty. */
private final static PrettyPrinter NOT_PRETTY_PRINTER = new com.fasterxml.jackson.core.util.MinimalPrettyPrinter();
public IndentingModifier(boolean indent) {
this.indent = indent;
}
/* (non-Javadoc)
* @see com.fasterxml.jackson.jaxrs.cfg.ObjectWriterModifier#modify(com.fasterxml.jackson.jaxrs.cfg.EndpointConfigBase, javax.ws.rs.core.MultivaluedMap, java.lang.Object, com.fasterxml.jackson.databind.ObjectWriter, com.fasterxml.jackson.core.JsonGenerator)
*/
@Override
public ObjectWriter modify(EndpointConfigBase<?> endpointConfigBase, MultivaluedMap<String, Object> multivaluedMap, Object o, ObjectWriter objectWriter, JsonGenerator jsonGenerator) throws IOException {
if(indent) {
// Pretty
jsonGenerator.useDefaultPrettyPrinter();
} else {
// Not pretty
jsonGenerator.setPrettyPrinter(NOT_PRETTY_PRINTER);
}
return objectWriter;
}
}
}
/**
*计算“pretty”查询参数。如果给定时没有任何值,或带有“true”:相当的JSON输出。
*例如/test?pretty或/test?pretty=true
*否则,输出时不带任何格式。
*
*@见https://stackoverflow.com/questions/10532217/jax-rs-json-pretty-output
*/
@提供者
@产生(MediaType.APPLICATION_JSON)
公共类RestPrettyJsonFilter实现ContainerResponseFilter{
公共静态最终字符串QUERYPARAM_PRETTY=“PRETTY”;
私有静态最终缩进修饰符缩进修饰符漂亮=新缩进修饰符(真);
私有静态最终缩进修饰符缩进修饰符不漂亮=新缩进修饰符(false);
@凌驾
公共无效筛选器(ContainerRequestContext reqCtx、ContainerResponseContext respCtx)引发IOException{
布尔值=假;
UriInfo UriInfo=reqCtx.getUriInfo();
//log.info(“prettyFilter:+uriInfo.getPath());
多值Map queryParameters=uriInfo.getQueryParameters();
if(queryParameters.containsKey(QUERYPARAM_PRETTY)){
//存在查询参数
字符串prettyParam=queryParameters.getFirst(QUERYPARAM_PRETTY);
//Pretty存在时没有任何值,或者值设置为“true”?
if(prettyParam==null | |“”.equals(prettyParam)| |“true”.equals(prettyParam)){
美丽=真实;
}
}
//防止重复创建对象
//set(新的缩进修饰符(pretty));
如果(漂亮){
objectWriterInputor.set(缩进修饰符);
}否则{
objectWriterInputor.set(缩进修饰符不美观);
}
}
/**
*用于打开/关闭每个响应的输出。
*/
公共静态类IndentingModifier扩展ObjectWriterModifier{
私有最终布尔缩进;
/**最小漂亮打印机打印不漂亮*/
private final static PrettyPrinter NOT_PRETTY_PRINTER=new com.fasterxml.jackson.core.util.MinimalPrettyPrinter();
公共缩进修饰符(布尔缩进){
this.indent=缩进;
}
/*(非Javadoc)
*@请参见com.fasterxml.jackson.jaxrs.cfg.ObjectWriterModifier#modify(com.fasterxml.jackson.jaxrs.cfg.EndpointConfigBase,javax.ws.rs.core.MultivaluedMap,java.lang.Object,com.fasterxml.jackson.databind.ObjectWriter,com.fasterxml.jackson.core.jsonggenerator)
*/
@凌驾
公共ObjectWriter修改(EndpointConfigBase EndpointConfigBase、MultivaluedMap MultivaluedMap、Object o、ObjectWriter ObjectWriter、JsonGenerator JsonGenerator)引发IOException{
如果(缩进){
//漂亮的
jsongGenerator.useDefaultPrettyPrinter();
}否则{
//不漂亮
setPrettyPrinter(不是漂亮的打印机);
}
返回objectWriter;
}
}
}
您使用的是bean还是应用服务器?您可能需要检查配置文件中的prettyPrint
属性。更新:我在正在处理的项目中找到了几个ObjectMapper实例。如果我写了类似OutputMapper.configure(SerializationConfig.Feature.INDENT\u OUTPUT,false)的东西;然后我会得到我正在寻找的非漂亮打印JSON,对吗?“OutputMapper.configure(SerializationConfig.Feature.INDENT_OUTPUT,false);然后我会得到我正在寻找的非漂亮打印JSON,对吗?”*理论上,是的,这应该会使ObjectMapper的实例不漂亮打印。不过,还可能有其他创建ObjectMapper的方法。编辑:为了详细说明,我在项目中搜索了所有新的ObjectMapper对象,但我想,除了简单地“私有静态最终ObjectMapper ObjectMapper;”之外,是否还有其他方法可以创建ObjectMapper然后可能仍然存在未经修改的ObjectMapper对象,比如它是通过工厂创建的,并且可以透明地使用。类似于:getMapperFactory().getMapper().getJsonFactory().createJsonGenerator(消息)
您将无法对此进行grep,因为ObjectMapper没有显式的实例变量
/**
* Evaluate the "pretty" query parameter. If given without any value, or with "true": pretty JSON output.
* E.g. /test?pretty or /test?pretty=true
* Otherwise output without any formatting.
*
* @see https://stackoverflow.com/questions/10532217/jax-rs-json-pretty-output
*/
@Provider
@Produces(MediaType.APPLICATION_JSON)
public class RestPrettyJsonFilter implements ContainerResponseFilter {
public static final String QUERYPARAM_PRETTY = "pretty";
private static final IndentingModifier INDENTING_MODIFIER_PRETTY = new IndentingModifier(true);
private static final IndentingModifier INDENTING_MODIFIER_NOT_PRETTY = new IndentingModifier(false);
@Override
public void filter(ContainerRequestContext reqCtx, ContainerResponseContext respCtx) throws IOException {
boolean pretty = false;
UriInfo uriInfo = reqCtx.getUriInfo();
//log.info("prettyFilter: "+uriInfo.getPath());
MultivaluedMap<String, String> queryParameters = uriInfo.getQueryParameters();
if(queryParameters.containsKey(QUERYPARAM_PRETTY)) {
// Pretty query parameter is present
String prettyParam = queryParameters.getFirst(QUERYPARAM_PRETTY);
// Pretty is present without any value, or value is set to "true"?
if (prettyParam == null || "".equals(prettyParam) || "true".equals(prettyParam)) {
pretty = true;
}
}
// Prevent recreation of objects over and over again
//ObjectWriterInjector.set(new IndentingModifier(pretty));
if (pretty) {
ObjectWriterInjector.set(INDENTING_MODIFIER_PRETTY);
} else {
ObjectWriterInjector.set(INDENTING_MODIFIER_NOT_PRETTY);
}
}
/**
* Used to switch on / off pretty output for each response.
*/
public static class IndentingModifier extends ObjectWriterModifier {
private final boolean indent;
/** Minimal pretty printer is not printing pretty. */
private final static PrettyPrinter NOT_PRETTY_PRINTER = new com.fasterxml.jackson.core.util.MinimalPrettyPrinter();
public IndentingModifier(boolean indent) {
this.indent = indent;
}
/* (non-Javadoc)
* @see com.fasterxml.jackson.jaxrs.cfg.ObjectWriterModifier#modify(com.fasterxml.jackson.jaxrs.cfg.EndpointConfigBase, javax.ws.rs.core.MultivaluedMap, java.lang.Object, com.fasterxml.jackson.databind.ObjectWriter, com.fasterxml.jackson.core.JsonGenerator)
*/
@Override
public ObjectWriter modify(EndpointConfigBase<?> endpointConfigBase, MultivaluedMap<String, Object> multivaluedMap, Object o, ObjectWriter objectWriter, JsonGenerator jsonGenerator) throws IOException {
if(indent) {
// Pretty
jsonGenerator.useDefaultPrettyPrinter();
} else {
// Not pretty
jsonGenerator.setPrettyPrinter(NOT_PRETTY_PRINTER);
}
return objectWriter;
}
}
}