2

デシリアライズするときMyEntity(これはインターフェースです)、私はどちらかを持っています

  • 次の入力:

    { "id": 123 }
    

    その場合、それをデシリアライズしたいと思います

    new MyEntityRef(123)
    
  • または、次の入力があります。

    {
        "id": 123,
        "message": "Hello world",
        "otherEntity": {
            "field": "value",
            ...
        }
    }
    

    その場合、次のようにデシリアライズしたいと思います

    new MyEntityImpl(123, "Hello world", otherEntity);
    

    whereotherEntityは、 のコンテキスト外で見つかった場合と同じ方法で逆シリアル化されますMyEntity

を介して独自のカスタム デシリアライザーを登録する方法を見つけましたが、SimpleModuleその方法がわかりません。

  1. いくつかのフィールド (上記など) の存在に基づいて、カスタム デシリアライザーを選択しますmessage
  2. 特定のフィールド (上記など) の「デフォルト」シリアライザーにフォールバックしますotherEntity
4

1 に答える 1

1

最後に、次のように ObjectMapper を構成することで解決しました。

ObjectMapper mapper = new ObjectMapper();

SimpleModule idAsRefModule = new SimpleModule("ID-to-ref",
                                              new Version(1, 0, 0, null));

idAsRefModule.addDeserializer(TestEntity.class,
                              new JsonDeserializer<TestEntity>() {
    @Override
    public TestEntity deserialize(JsonParser jp, DeserializationContext dc)
            throws IOException, JsonProcessingException {

        ObjectCodec codec = jp.getCodec();
        JsonNode node = codec.readTree(jp);
        boolean isFullImpl = node.has("message");
        Class<? extends TestEntity> cls = isFullImpl ? TestEntityImpl.class
                                                     : TestEntityRef.class;
        return codec.treeToValue(node, cls);
    }
});

mapper.registerModule(idAsRefModule);

return mapper;
于 2013-10-19T09:38:04.353 に答える