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を切り替えられる。