0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Posted at

はじめに

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

最初に結論

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

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

実装例

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

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です。

実装例は以下の通りです。

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("");
        }
    });
}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?