【发布时间】:2014-10-05 23:30:27
【问题描述】:
我有一个类,其中包含一个 Map(带有非 String 键)和一些其他字段。
public class MyClass() {
private Map<KeyObject, OtherObject> map;
private String someField;
public MyClass(Map<KeyObject, OtherObject> map, String someField) {
this.map = map;
this.someField = someField;
}
// Getters & Setters
}
我想使用 Jackson 序列化和反序列化这个类。 我看到了一种不同的方法,并决定尝试使用jackson modules。
我关注this post 并扩展了 JsonDeserializer 和 JsonSerializer。问题是这些类应该是类型的,所以它应该看起来像
public class keyDeserializer extends JsonDeserializer<Map<KeyObject, OtherObject>> {
...
}
KeySerializer 也是如此。
然后添加到模块中:
module.addSerializer(new keySerializer());
module.addDeserializer(Map.class, new keyDeserializer());
但这显然是错误的,因为我遇到了异常:
keySerializer does not define valid handledType() -- must either register with method that takes type argument or make serializer extend 'org.codehaus.jackson.map.ser.std.SerializerBase'
我可以将我的序列化器和反序列化器输入到 MyClass,但是我不得不手动解析所有这些,这是不合理的。
更新:
我设法通过使用注释绕过了代码中的模块创建
@JsonDeserialize(using = keyDeserializer.class)
@JsonSerialize(using = keySerializer.class)
private Map<KeyObject, OtherObject> map;
但是我必须自己从 toString() 输出序列化/反序列化整个地图结构。所以尝试了不同的注释:
@JsonDeserialize(keyUsing = MyKeyDeserializer.class)
private Map<KeyObject, OtherObject> map;
MyKeyDeserializer 扩展 org.codehaus.jackson.map.KeyDeserializer 并覆盖该方法的地方
public Object deserializeKey(String key, DeserializationContext ctxt) throws IOException, JsonProcessingException {...}
然后手动反序列化我的密钥,但再次从我的密钥类的 toString() 输出。
这不是最优的(这依赖于 toString() 方法)。有没有更好的办法?
【问题讨论】:
-
查看这个stackoverflow.com/questions/6371092/… 问题和这个stackoverflow.com/questions/11246748/…。你的
KeyObject对象是什么样子的? -
请注意,您正在查看的 Jackson 版本已过时。
-
@chrylis 目前我正在使用杰克逊 1.9。有没有使用杰克逊 2.x 的简单方法?可以分享一个链接吗?
标签: java serialization map jackson jackson-modules