spring
Jackson
spring-boot

SpringBootでJackson使用時にnullを空文字として扱いたい

目的

@ResponseBodyを利用時にフィールドにnullが設定されているオブジェクトを送信する際に生成されるJSONをnullを空文字に変換して送信したい。

これを

before
{
 "hoge":"null",
 "fuga":"fuga"
}

こうしたい

after
{
 "hoge":"",
 "fuga":"fuga"
}

まとめ

Jacksonが提供するObjectMapperに独自定義したシリアライザーをDefaultSerializerProviderを通して設定してやればよい。
この流れをSpringBootで実現する方法。

設定方法

SpringBoot利用時にはなるべくXML等を利用せず設定用のBeanを@Configrationを設定したクラスにまとめることが推奨されているので例にならって実装します。

設定用BeanComponent

AppConfig.Java
@Configuration
public class AppConfig {
  @Bean
  public Jackson2ObjectMapperBuilder jackson2ObjectMapper() {
    Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder() {
      @Override
      public void configure(Object objectMapper) {
        super.configure(objectMapper);
        DefaultSerializerProvider.Impl dsp = new DefaultSerializerProvider.Impl();
        dsp.setNullValueSerializer(new NullValueSerializer());
        objectMapper.setSerializerProvider(dsp);
      }
    };
    return builder;
  }
}

独自シリアライザ

NullValueSerializer.Java
public class NullValueSerializer extends JsonSerializer<Object> {

    @Override
    public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers)
            throws IOException, JsonProcessingException {
        gen.writeString("");
    }

}

参考

https://qiita.com/hikaruworld@github/items/0d629580584de1708b71

http://www.ne.jp/asahi/hishidama/home/tech/java/spring/boot/rest/jackson.html