2016年3月5日土曜日

[Jackson]特定の型に対してカスタムなシリアライザを設定する

特定の型に対して一括でカスタムなシリアライザを適用する方法。
このパターンを使用すると、シリアライズ対象のプロパティ(getter)にアノテーションでシリアライザを指定しなくてよくなります。
特定型に対して一律シリアライザを適用する場合には、もれなく実行できるメリットがあります。

カスタムなシリアライザの作り方はこちら→[Jackson]末尾のスペースを取り除いんてjson変換する

この例では、String型のプロパティに対して一律スペースをトリムするシリアライザが適用されます。
final Sample sample = new Sample();
sample.setName("aa ");
sample.setAge(100);

// 型とシリアライザのマッピングを定義
final SimpleModule simpleModule = new SimpleModule();
simpleModule.addSerializer(String.class, new TrimSpaceSerializer());

final ObjectMapper objectMapper = new ObjectMapper();
// ObjectMapperにシリアライザの定義を持つモジュールを追加
objectMapper.registerModule(simpleModule);
final String result = objectMapper.writeValueAsString(sample);

// カスタムなシリアライザ
private static class TrimSpaceSerializer extends JsonSerializer {
    @Override
    public void serialize(
            String value,
            JsonGenerator gen,
            SerializerProvider serializers) throws IOException, JsonProcessingException {
        gen.writeString(value.trim());
    }
}

実行すると、この結果のようにString型のプロパティに対してトリムが行われます。
{"name":"aa","age":100}