Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何防止Jackson输出漂亮的打印JSON?_Java_Json_Jackson - Fatal编程技术网

Java 如何防止Jackson输出漂亮的打印JSON?

Java 如何防止Jackson输出漂亮的打印JSON?,java,json,jackson,Java,Json,Jackson,我想确保Jackson生成的JSON文件永远不会被打印出来。我是一名初级工程师,正在从事一个已经存在的项目,因此我需要反向工作,以找到所有可以将JSON配置为以漂亮打印输出的方法。我可以确认项目中有0个对.defaultPrettyPrintingWriter()的引用,还有0个对.setSerializationConfig的引用,我相信这也可以用于启用漂亮打印 那么这还有什么可能呢?或者,是否有可靠的方法来确保JSON文件不漂亮打印?不确定您使用的是哪个版本的Jackson,但在最新版本(1

我想确保Jackson生成的JSON文件永远不会被打印出来。我是一名初级工程师,正在从事一个已经存在的项目,因此我需要反向工作,以找到所有可以将JSON配置为以漂亮打印输出的方法。我可以确认项目中有0个对.defaultPrettyPrintingWriter()的引用,还有0个对.setSerializationConfig的引用,我相信这也可以用于启用漂亮打印


那么这还有什么可能呢?或者,是否有可靠的方法来确保JSON文件不漂亮打印?

不确定您使用的是哪个版本的Jackson,但在最新版本(1.9.10)中,JsonGenerator的默认行为是不漂亮打印。打开它最简单的方法是调用
generator.useDefaultPrettyPrinter()
generator.setPrettyPrinter(新的DefaultPrettyPrinter())
。尝试搜索
useDefaultPrettyPrinter
setPrettyPrinter
并删除这些语句。

取决于您使用的Spring版本映射JacksonHttpMessageConverter‌​r应具有名为
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;
    }
  }
}