はじめに
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("");
}
});
}