如何配置Jackson ObjectMapper将Foo类型的所有字段反序列化为SubclassOfFoo的实例?

用户名

我正在反序列化一个较大的json值。JSON对象深深地嵌套在该值中,如下所示:

{
  "fieldOne": "valueOne",
  "fieldTwo": {
    "innerField": "innerValue"
  }
}

我正在使用JacksonObjectMapper将大型json值反序列化为3rd party类。深入嵌套在该第三方类别中的是另一第三方类别:

public class DeepThirdPartyClass {
    public String fieldOne;
}

不幸的是,该fieldTwo物业丢失了我可以创建自己的类,添加缺少的字段:

public class MyClass extends DeepThirdPartyClass {
    public MySubObject fieldTwo;
}

我如何配置杰克逊,以便每当它尝试将值DeepThirdPartyClass反序列化为时,它反而反序列化为MyClass

用户名

我重新设计了@ olga-khylkouskaya的解决方案以适合我的问题:

@Test
public void newDeserializer() throws Exception {
    ObjectMapper objectMapper = new ObjectMapper();
    SimpleModule module = new SimpleModule("DeepThirdPartyClass subclass override", new Version(1, 0, 0, "FINAL", "com.example", "deep-third-party-class-override"));
    module.addDeserializer(DeepThirdPartyClass.class, new JsonDeserializer<DeepThirdPartyClass>() {
        @Override
        public DeepThirdPartyClass deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
            return p.readValueAs(MyClass.class);
        }
    });
    objectMapper.registerModule(module);
    objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

    String json = "{\n" +
            "  \"middle\": {\n" +
            "    \"fieldOne\": \"valueOne\",\n" +
            "    \"fieldTwo\": {\n" +
            "      \"fieldThree\": \"valueThree\"\n" +
            "    }\n" +
            "  }\n" +
            "}\n";

    ThirdPartyClass thirdPartyClass = objectMapper.readValue(json, ThirdPartyClass.class);
}

public class ThirdPartyClass {
    public DeepThirdPartyClass middle;
}

public class InnerClass {
    public String fieldThree;
}

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Jackson JsonDeserializer委托将字段反序列化为该字段类型的默认反序列化器

Jackson将数组元素反序列化为特定字段

如何使用Jackson的objectMapper反序列化接口字段?

使用没有JsonSubTypes的jackson将接口反序列化为特定类型

直接将JSON响应反序列化为强类型对象时,如何避免出现字段?

如何使用Jackson来有条件地反序列化为POJO字段?

Jackson如何将json反序列化为通用类型?

Spring MVC:使用 Jackson objectMapper 将查询参数反序列化为 POJO

如何使用Jackson将反序列化的JSON反序列化为忽略键的对象?

如何使用System.Text.Json将所有`Nullable <T>`值类型的空字符串反序列化为空值?

如何使用Jackson将Java Enums序列化和反序列化为JSON对象

使用Jackson将不同类型反序列化为单个字段

如何基于嵌套对象的字段之一将嵌套的json对象反序列化为原始类型

如何将xml中的数组反序列化为没有类型属性的不同对象类型?

用Jackson将多个json键反序列化为一个字段

使用Jackson将MongoDB日期字段反序列化为Java POJO

使用Jackson将JSON字符串或对象反序列化为String字段

如何反序列化json数组,然后将普通属性反序列化为jackson中的pojo。单独的数组有效

Jackson真的无法将json反序列化为通用类型吗?

如何使用ObjectMapper Jackson反序列化泛型类型

Jackson 反序列化为默认子类型

如何将结构反序列化/序列化为没有键的数组

如何使用Jackson ObjectMapper序列化从JSON响应中替换空字段(嵌套在所有级别)?

如何制作可以反序列化为几种类型之一的config.rs字段?

使用Jackson XmlMapper将XML反序列化为POJO

使用Jackson将JSON反序列化为ArrayList <POJO>

Java Spring:将Jackson反序列化为ZonedDateTime

Jackson-将地图实现反序列化为HashMap

使用GSON或Jackson将JSON反序列化为具有通用参数的类