【发布时间】:2014-03-14 11:38:36
【问题描述】:
我正在尝试反序列化两种类型的 json:
{
name: "bob",
worksAt: {
name: "Bobs department store",
location: "downtown"
},
age: 46
}
和
{
name: "Tom",
worksAt: "company:Bobs department store",
age: 27
}
进入这些对象:
第一种方式创建两个新对象,第二种方式根据字符串的内容从数据库中请求对象。
有点像杰克逊映射器如何将任意字符串反序列化为对象,对于像这样的对象:
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...
}
}
问题是我两者都需要。我需要它来处理对象和字符串。两者都可以从同一个输入到达。
我尝试的第一个想法是制作一个转换器
它说这些创建了一个委托类型以传递给反序列化器,但即使数据类型不是字符串,也始终应用转换器。所以这没有用。
我也尝试了一个普通的反序列化器,但我找不到一种方法来推迟到 BeanDeserializer。 beanDeserializer 太复杂了,我无法手动实例化它。我也看不出有办法推迟到杰克逊映射器中的默认反序列化器。
我是否必须重新实现杰克逊映射器反序列化才能做到这一点?反序列化器有没有办法说“我不能这样做,使用默认实现。”?
编辑:一些进一步的进展。根据 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 并且整个事情都失败了。所以我不知道为什么会这样......
【问题讨论】:
标签: jackson