SpringでJSONの出力項目を""で括って出力

# はじめに
SpringにてJSON形式で出力したい場合は、Controlerクラスのメソッドに``@ResponseBosy``アノテーションを付与することで様々な形式のデータをJSONとして出力できます。
ただし、各出力項目を""で括るか括らないかに関しては、対応する変数の型に依存します。
それは、JSONの仕様に基づいているのですが、クライアント側とのデータのやり取りにおいて、すべての項目を文字列として""括りで出力したい場合もあります。
そのようなケースに対応する方法を説明します。

# 最初に結論

以下に投稿した記事の組み合わせで対応可能です。

https://qiita.com/norippe3/items/ae84940896ae1008698f#json%E3%81%B8%E3%81%AE%E6%97%A5%E4%BB%98%E5%87%BA%E5%8A%9B%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E3%82%92%E7%B5%B1%E4%B8%80%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95

https://qiita.com/norippe3/items/850d19f5a4328af100ee#%E6%95%B0%E5%80%A4%E3%82%82%E5%85%A8%E3%81%A6%E3%81%A7%E3%81%8F%E3%81%8F%E3%81%A3%E3%81%A6%E5%87%BA%E5%8A%9B

要するに、Springで使用しているObjectMapperに、数値を文字列として扱うシリアライザーやBooleanを文字列として扱うシリアライザーを登録すればよいという訳です。
２つめの記事では、Jackson CSVにて項目を""で括って出力する方法を説明しましたが、同じ方法でシリアライザーを登録すればOKです。

# 実装例

それでは、実装例を示します。

```java:WebMvcConfig
@Override
public void extendMessageConverters(
        List<HttpMessageConverter<?>> converters) {

    MappingJackson2HttpMessageConverter converter = null;
    // 定義済みのMappingJackson2HttpMessageConverterを取得
    for (HttpMessageConverter<?> httpMessageConverter : converters) {
        if (httpMessageConverter instanceof MappingJackson2HttpMessageConverter) {
            converter = (MappingJackson2HttpMessageConverter) httpMessageConverter;
            break;
        }
    }

    SimpleModule module = new SimpleModule();
    
    // 数値を文字列として扱う
    module.addSerializer(new StdSerializer<>(Number.class) {
        @Override
        public void serialize(Number value, JsonGenerator gen, SerializerProvider provider)
                throws IOException {
            gen.writeString(value.toString());
        }
    });

    // Booleanを文字列として扱う
    module.addSerializer(new StdSerializer<>(Boolean.class) {
        @Override
        public void serialize(Boolean value, JsonGenerator gen, SerializerProvider provider)
                throws IOException {
            gen.writeString(value.toString());
        }
    });

    converter.getObjectMapper().registerModule(module);
}
```
# JSONの項目内容がNULLの場合に空文字を出力したい場合

これも、以下の記事にてJackson CSVでNULLの項目を空文字出力する方法を説明しましたが、同じ方法でシリアライザーを登録すればOKです。

https://qiita.com/norippe3/items/850d19f5a4328af100ee#null%E3%81%AE%E9%A0%85%E7%9B%AE%E3%82%82%E3%81%A7%E3%81%8F%E3%81%8F%E3%81%A3%E3%81%A6%E5%87%BA%E5%8A%9B

実装例は以下の通りです。
```java:WebMvcConfig
@Override
public void extendMessageConverters(
        List<HttpMessageConverter<?>> converters) {

    MappingJackson2HttpMessageConverter converter = null;
    // 定義済みのMappingJackson2HttpMessageConverterを取得
    for (HttpMessageConverter<?> httpMessageConverter : converters) {
        if (httpMessageConverter instanceof MappingJackson2HttpMessageConverter) {
            converter = (MappingJackson2HttpMessageConverter) httpMessageConverter;
            break;
        }
    }


    SimpleModule module = new SimpleModule();
    // 各シリアライザーやデシリアライザーをmoduleに登録する処理を記述
    // ...
    converter.getObjectMapper().registerModule(module);

    // NULLは空文字として扱う
    converter.getObjectMapper().getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>() {
        @Override
        public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers)
                throws IOException {
            gen.writeString("");
        }
    });
}
```