2016年3月4日金曜日

[Jackson]末尾のスペースを取り除いてjson変換する

Jacksonを使ってオブジェクトをシリアライズするときに、文字列内のスペースをトリムする方法です。
なお、使用しているJacksonのバージョンは2.7.2となります。

デフォルトでは、何も行われないので、下の実行結果のように末尾のスペースがそのままシリアライズされます。

デフォルトの場合の動作

Sample sample = new Sample();
sample.setName("aaaa   ");

StringWriter writer = new StringWriter();
objectMapper.writeValue(writer, sample);

{"name":"aaaa   "}

スペースを除去するためには、カスタムのシリアライザを作成し、アノテーションで設定する必要があります。
このページが参考になります。

http://stackoverflow.com/questions/7161638/how-do-i-use-a-custom-serializer-with-jackson


カスタムのシリアライザの実装

JsonSerializerを継承して、serializeメソッドで値を書き換えます。
シリアライズ対象の値(value)をtrimして書き込みます。
private static class TrimSpaceSerializer extends JsonSerializer<String> {

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

Beanにシリアライザを設定する

カスタムシリアライザをJsonSerializeアノテーションのusing属性に設定します。
JsonSerializeは、値を変換書けたいプロパティのgetterに設定します。
private static class Sample {
    private String name;

    @JsonSerialize(using = TrimSpaceSerializer.class)
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

実行結果

スペースがトリムされました。
{"name":"aaaa"}