SpringBootのWebAPIでResponseのJSONをPretty Printにする #springboot

SpringBootでWeb APIを作ってる時に、ResponseのJSONをPretty Printにしたくなった時の対応。

やりたいこと

こういうのを

{"hoge":[123,456],"huga":"Yeah!","piyo":{"code":"AA1234","name":"Bob"}}

こういう感じにしたい

{
  "hoge" : [ 123, 456 ],
  "huga" : "Yeah!",
  "piyo" : {
    "code":"AA1234",
    "name":"Bob"
  }
}

結論

ObjectMapperをカスタマイズする。
カスタマイズにはいくつか方法がある。

application.ymlを変更する

spring.jackson.serialization.indent_output=true にすれば、それだけでOK

YAMLだとこんな感じ。

spring:
  jackson:
    serialization:
      indent_output: true

ObjectMapperを自前で用意する

独自Serializer等のために自前でObjectMapperを用意していたりすると、前述の方法は使えない。

Primaryにしている自前のObjectMapperに対して、Pretty Printを有効にしてやる必要がある。

/**
 * 独自ObjectMapper
 */
@Bean
@Primary
public ObjectMapper jsonObjectMapper() {
    ObjectMapper mapper = new ObjectMapper();
    mapper.registerModule(myModule());

    // Pretty Printにする
    mapper.enable(SerializationFeature.INDENT_OUTPUT);
    
    return mapper;
}

独自ObjectMapperを活用しつつ、application.ymlで変更できるようにする

ObjectMapperのカスタマイズ具合にもよるのかもしれないけれど、やっぱり設定ファイルで気軽に変更できるようにしたい。

そういう時はSpringBootを真似してObjectMapperを生成してやるとよさそう。

/**
 * 独自ObjectMapper
 */
@Bean
@Primary
public ObjectMapper jsonObjectMapper(Jackson2ObjectMapperBuilder builder) {
    // Jackson2ObjectMapperBuilderを引数に追加
    // Bootを真似してObjectMapperを生成
    ObjectMapper mapper = builder.createXmlMapper(false).build();
    mapper.registerModule(myModule());
    
    return mapper;
}

こうすると、最初と同じようにapplication.ymlの変更でPretty Printを切り替えられる。

参考