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

Aioobe

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

  • 以下输入:

    { "id": 123 }
    

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

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

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

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

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

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

我已经想出了如何通过来注册自己的自定义反序列化器,SimpleModule但是我不知道如何

  1. 根据某个字段的存在(message如上),选择一个自定义解串器
  2. 对某些字段(例如otherEntity上述字段的“默认”序列化程序进行回退
Aioobe

最后通过配置我的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;

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

JSON Jackson-使用自定义序列化程序序列化多态类时的异常

如何使用尊重自定义注释的Jackson来执行自定义JSON反序列化?

使用Jackson自定义JSON反序列化

某些字段的Jackson JSON自定义序列化

在Java中使用Jackson进行JSON FIELD的自定义反序列化?

在Java中使用Jackson反序列化Date字段时引发自定义异常

如何使用Serde使用自定义函数反序列化可选字段?

使用Jackson进行自定义反序列化:扩展默认反序列化器

Jackson,针对特定字段名称的自定义反序列化

当值为“ null”时,Jackson忽略自定义字段反序列化器

Jackson对多态对象的自定义反序列化

如何使用Json.Net使用自定义键对字典进行序列化/反序列化?

使用Jackson自定义反序列化列表

使用jackson-dataformat-xml自定义根元素的XML反序列化?

自定义反序列化器仅适用于json.NET的某些字段

使用Jackson自定义反序列化JSON字段

如何使用自定义JsonConverter在Json.NET中仅反序列化子对象?

使用Jackson在Java中嵌套自定义反序列化

使用lombok自定义序列化和反序列化的字段名称

使用自定义IXmlSerializer反序列化注释

使用Json.NET为具有多个值类型的字段自定义反序列化器

使用GSON自定义反序列化枚举

使用Jackson序列化自定义地图

使用Jackson的自定义JSON序列化/反序列化

Jackson JSON无法使用自定义根名称反序列化元素数组?

Jackson-仅将自定义反序列化器用于特定的JSON

使用 Jackson 从 JSON 反序列化 Scala 地图字段

使用自定义反序列化器 Jackson 将 .json 文件转换为 Java 对象

使用 System.Text.Json 自定义反序列化 - 将字段分组为对象