web-dev-qa-db-ja.com

ジャクソンにカスタムデシリアライザーをどこでも使用させる(私のタイプではないタイプの場合)

JacksonのJSONカスタムデシリアライザーをセットアップして、JSON値をLongオブジェクトに変換しようとしています。私はこのサイトの指示に従いました: http://wiki.fasterxml.com/JacksonHowToCustomDeserializers カスタムデシリアライザーをセットアップします。

ただし、カスタムデシリアライザーを有効にするには、毎回常に注釈を付ける必要があります。

_public class TestBean {
    Long value;

    @JsonDeserialize(using=LongJsonDeserializer.class)
    public void setValue(Long value) {
       this.value = value;
     }
 }
_

毎回@JsonDeserialize(using=LongJsonDeserializer.class)アノテーションを使用する必要なく、常にカスタムデシリアライザーを使用してすべてのLongプロパティをデシリアライズするようにJacksonに指示する方法はありますか?

14
missionE46
LongJsonDeserializer deserializer = new LongJsonDeserializer();

SimpleModule module =
  new SimpleModule("LongDeserializerModule",
      new Version(1, 0, 0, null, null, null));
module.addDeserializer(Long.class, deserializer);

ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(module);

これが完全なデモアプリケーションです。これは、Jacksonの最新リリースで動作し、おそらく1.7に戻るJacksonバージョンでも動作します。

import Java.io.IOException;

import org.codehaus.jackson.JsonParser;
import org.codehaus.jackson.JsonProcessingException;
import org.codehaus.jackson.Version;
import org.codehaus.jackson.map.DeserializationContext;
import org.codehaus.jackson.map.JsonDeserializer;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.module.SimpleModule;

public class Foo
{
  public static void main(String[] args) throws Exception
  {
    TestBean bean = new TestBean();
    bean.value = 42L;

    ObjectMapper mapper = new ObjectMapper();

    String beanJson = mapper.writeValueAsString(bean);
    System.out.println(beanJson);
    // output: {"value":42}

    TestBean beanCopy1 = mapper.readValue(beanJson, TestBean.class);
    System.out.println(beanCopy1.value);
    // output: 42

    SimpleModule module =
      new SimpleModule("LongDeserializerModule",
          new Version(1, 0, 0, null));
    module.addDeserializer(Long.class, new LongJsonDeserializer());

    mapper = new ObjectMapper();
    mapper.registerModule(module);

    TestBean beanCopy2 = mapper.readValue(beanJson, TestBean.class);
    System.out.println(beanCopy2.value);
    // output: 126
  }
}

class TestBean
{
  Long value;
  public Long getValue() {return value;}
  public void setValue(Long value) {this.value = value;}
}

class LongJsonDeserializer extends JsonDeserializer<Long>
{
  @Override
  public Long deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException
  {
    Long value = jp.getLongValue();
    return value * 3;
  }
}
30