nso*_*mer 6 java generics serialization jackson
我需要为具有泛型的类编写自定义反序列化器。我找不到办法做到这一点,但是我无法想象我是唯一一个遇到这个问题的人。据我所知,有两种方法可以实现这一点,但它们都无法实现:
例如:
public class Foo<T> {}
public class FooDeserializer<T> {
public FooDeserializer(Class<T> type) { ... }
...
}
// Boilerplate code...
module.addDeserializer(Foo.class, new FooDeserializer<Bar1>(Bar1.class));
module.addDeserializer(Foo.class, new FooDeserializer<Bar2>(Bar2.class));
Run Code Online (Sandbox Code Playgroud)
这不起作用,当 ObjectMapper 实例获取 Foo 的实例时,没有可用的泛型参数的类型信息(类型擦除),因此它只是选择最后注册的反序列化器。
例如:
String json = "...";
ObjectMapper mapper = ...;
Foo<Bar1> foo = new Foo<>(Bar1.class);
foo = mapper.readValue(json, Foo.class); // Can't pass empty foo instance with Class<?> field containing Bar1.class
Run Code Online (Sandbox Code Playgroud)
需要这样的东西:
mapper.readValue(json, Foo.class, Bar1.class); // Doesn't exist in jackson
Run Code Online (Sandbox Code Playgroud)
任何建议如何做到这一点?
编辑:我找到了解决问题的方法,但这不是一个干净的解决方案:
我使用 Class 字段扩展 FooDeserializer 以保存 Foo 的通用参数的类型。然后,每次我想将一些 json 反序列化为一个新的 Foo 实例时,我都会得到一个新的 ObjectMapper 实例(我在工厂的预配置实例上使用 ObjectMapper#copy)并将它传递给一个新的模块,其中包含 FooDeserializer 的一个实例类参数(我知道此时的类型)。模块、FooDeserializer 和 ObjectMapper 副本是短暂的,它们仅针对此单个反序列化操作进行实例化。正如我所说,不是很干净,但仍然比多次子类 Foo 并为每个子类编写一个反序列化器要好。
例子:
public class FooDeserializer<T> extends StdDeserializer<T> {
private Class<T> type;
public FooDeserializer(Class<T> type) { this.type = type }
...
}
// Meanwhile, before deserialization:
ObjectMapper mapper = MyObjectMapperFactory.get().copy();
SimpleModule module = new SimpleModule(new Version(0,0,1,null,null,null);
module.addDeserializer(Foo.class, new FooDeserializer(Bar1.class);
mapper.addModule(module);
Foo<Bar1> x = mapper.readValue(json, Foo.class);
Run Code Online (Sandbox Code Playgroud)
可能将其放入实用方法中以隐藏丑陋。
小智 0
我认为您不需要编写我们自己的自定义解串器。您可以使用此语法来反序列化使用泛型(取自另一个 Stack Overflow 线程)的对象。
mapper.readValue(jsonString, new TypeReference<Data<String>>() {});
Run Code Online (Sandbox Code Playgroud)
几个资源可以帮助您: Jackson - 使用泛型类进行反序列化 http://www.tutorialspoint.com/jackson/jackson_data_binding_generics.htm
| 归档时间: |
|
| 查看次数: |
12854 次 |
| 最近记录: |