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());
mapper.enable(SerializationFeature.INDENT_OUTPUT);
return mapper;
}
独自ObjectMapperを活用しつつ、application.ymlで変更できるようにする
ObjectMapperのカスタマイズ具合にもよるのかもしれないけれど、やっぱり設定ファイルで気軽に変更できるようにしたい。
そういう時はSpringBootを真似してObjectMapperを生成してやるとよさそう。
独自ObjectMapper
@Bean
@Primary
public ObjectMapper jsonObjectMapper(Jackson2ObjectMapperBuilder builder) {
ObjectMapper mapper = builder.createXmlMapper(false).build();
mapper.registerModule(myModule());
return mapper;
}
こうすると、最初と同じようにapplication.ymlの変更でPretty Printを切り替えられる。
参考