9

Jacksonによって生成されたJSONファイルが決してきれいに印刷されないようにしたいと思います。私は既存のプロジェクトに取り組んでいる後輩なので、JSONをきれいな印刷として出力するように構成できるすべての方法を見つけるために逆方向に作業する必要があります。プロジェクトに.defaultPrettyPrintingWriter()への参照が0個あり、.setSerializationConfigへの参照が0個あることを確認できます。これは、きれいな印刷を有効にするためにも使用できると思います。

では、これは他にどのように可能ですか?または、JSONファイルがきれいに印刷されないようにする確実な方法はありますか?

4

3 に答える 3

2

使用している Spring のバージョンに応じて、JSON をシリアル化するときにプリンターを構成するMappingJacksonHttpMessageConverte‌​rという名前のブール値プロパティが必要です。prettyPrint

したがって、この XML 構成でうまくいくはずです (Spring 3 の最近のバージョンを使用している場合)。

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAda‌​pter">
  <property name="messageConverters">
    <list>
      <ref bean="jsonConverter" />
    </list>
  </property>
</bean>

<bean id="jsonConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverte‌​r">
  <property name="supportedMediaTypes" value="application/json" />
  <property name="objectMapper" ref="jacksonObjectMapper" />
  <property name="prettyPrint" value="false" />
</bean>

プロパティを紹介する githubで関連するコミットを確認できます。そして、このプロパティを含むクラスのトランク バージョンも。最後に、これは以前のコミットに関連するSpring Jira イシューSPR-7201です。

または、Alexander Ryzhov が述べたように、Jackson のバージョンをuseDefaultPrettyPrinterandメソッドを含む最新のものに更新してみてください。setPrettyPrinter

于 2012-10-25T15:44:04.640 に答える
1

最も洗練された解決策は、プリティ/非プリティのスイッチをフィルターに入れ、静的構成オブジェクトを再利用することです。これにより、無用なガベージ コレクションが防止されます。

/**
 * 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;
    }
  }
}
于 2017-12-19T08:16:44.363 に答える
0

使用しているジャクソンのバージョンはわかりませんが、最新バージョン (1.9.10) では、JsonGenerator のデフォルトの動作はきれいな印刷ではありません。オンにする最も簡単な方法は、generator.useDefaultPrettyPrinter()またはを呼び出すことgenerator.setPrettyPrinter(new DefaultPrettyPrinter())です。これらのステートメントを検索して削除してみてuseDefaultPrettyPrinterくださいsetPrettyPrinter

于 2012-10-25T06:31:05.500 に答える