jackson - 为 Jackson Mapper 提供多种方法来反序列化同一对象

标签 jackson

我正在尝试反序列化两种类型的 json:

{
    name: "bob",
    worksAt: {
        name: "Bobs department store",
        location: "downtown"
    },
    age: 46
}

{
    name: "Tom",
    worksAt: "company:Bobs department store",
    age: 27
}

进入这些对象:

UML of classes

第一种方式创建两个新对象,第二种方式根据字符串的内容从数据库请求对象。

有点像 jackson 映射器如何将任意字符串反序列化为对象,对于这样的对象:

public class Company{
    public String name;
    public Employee[] employees
    public Company(){}
    public Company(String json){
        //turn string into object using whatever encoding you want blah blah blah...
    }
}

问题是我两者都需要。我需要它来处理对象和字符串。两者都可以来自相同的输入。

我尝试的第一个想法是制作一个转换器

它说这些创建了一个委托(delegate)类型来传递给反序列化器,但即使数据类型不是字符串,也始终会应用转换器。所以这不起作用。

我也尝试过普通的反序列化器,但我找不到遵循 BeanDeserializer 的方法。 beanDeserializer 非常复杂,我无法手动实例化它。我还认为没有办法遵循 Jackson Mapper 中的默认反序列化器。

我是否必须重新实现 Jackson Mappers 反序列化才能执行此操作?有没有办法让反序列化器说“我不能这样做,使用默认实现。”?

编辑:一些进一步的进展。基于 Jackson Mapper 源代码,看起来您可以像这样实例化 bean 反序列化器:

DeserializationConfig config = ctxt.getConfig();
JavaType type = config.constructType(_valueClass);
BeanDescription introspect = config.introspect(type);
JsonDeserializer<Object> beanDeserializer = ctxt.getFactory().createBeanDeserializer(ctxt, type , introspect);

但由于某种原因,所有 _beanProperties 都为其 _valueDeserializer 设置了 FailingDeserializer,整个过程失败了。所以我不知道为什么会发生这种情况......

最佳答案

你试过吗writing a custom deserializer ?这使您可以最大程度地控制 Jackson 反序列化对象的方式。您可以尝试用一种方法反序列化,如果出现错误,请尝试另一种方法。

jackson 还可以处理polymorphic deserialization ,尽管这需要对 json 进行一些小的更改以包含类型信息,而且听起来您的问题约束可能不允许这样做。

关于jackson - 为 Jackson Mapper 提供多种方法来反序列化同一对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21790727/

相关文章:

java - Jackson Web Servlet 线程安全吗?

java - Jackson:如何在 JSON 序列化中包含空值属性

java - Jackson JSON 将整数转换为字符串

java - 未能延迟初始化角色集合 :

java - 我应该在 HTTPClass 中的哪里实现这个 Jackson Root Element 代码?

java - 如何阻止 Jackson JSON 映射器隐式转换为字符串?

java - 使用 Jackson 反序列化递归 Map<String,Object> 后避免类型安全警告

java - 关于 Jackson 转换 Java 数据类型

java - 使用 Jackson 解析 JSON Bing 结果

java - Jackson 在 Spring Boot 中错误地序列化了 ZonedDateTime