我正在尝试反序列化两种类型的 json:
{
name: "bob",
worksAt: {
name: "Bobs department store",
location: "downtown"
},
age: 46
}
和
{
name: "Tom",
worksAt: "company:Bobs department store",
age: 27
}
进入这些对象:
第一种方式创建两个新对象,第二种方式根据字符串的内容从数据库请求对象。
有点像 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/