仅当存在特定字段时才自定义 JSON 反序列化(使用 Jackson)

2024-02-27

反序列化时MyEntity(这是一个接口)我要么有

  • 以下输入:

    { "id": 123 }
    

    在这种情况下,我想将其反序列化为

    new MyEntityRef(123)
    
  • 或者我有以下输入:

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

    在这种情况下我想将其反序列化为

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

    where otherEntity反序列化的方式与在上下文之外找到它的方式相同MyEntity.

我已经弄清楚如何通过注册我自己的自定义反序列化器SimpleModule但我不知道该怎么做

  1. 根据某些字段的存在选择自定义解串器(例如message above).
  2. 某些字段的“默认”序列化器的回退(例如otherEntity above).

最后通过配置我的 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;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

仅当存在特定字段时才自定义 JSON 反序列化(使用 Jackson) 的相关文章

随机推荐