我有一个包含 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
}
我想使用杰克逊序列化和反序列化这个类。我看到了一种不同的方法,并决定尝试使用杰克逊模块。
我关注了这篇文章并扩展了 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() 方法)。有没有更好的办法?