我有一个包含地图(带有非字符串键)和一些其他字段的类.
public class MyClass() {
private Map map;
private String someField;
public MyClass(Map map, String someField) {
this.map = map;
this.someField = someField;
}
// Getters & Setters
}
我想使用Jackson来对该类进行序列化和反序列化.
我看到了另一种方式,决定尝试使用jackson modules.
我遵循了this post,并扩展了JsonDeserializer和JsonSerializer.问题在于这些类应该被键入,因此看起来应该像
public class keyDeserializer extends JsonDeserializer> {
...
}
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 map;
但是然后我必须自己从toString()输出中对整个映射结构进行序列化/反序列化.因此尝试了不同的注释:
@JsonDeserialize(keyUsing = MyKeyDeserializer.class)
private Map map;
MyKeyDeserializer在哪里扩展org.codehaus.jackson.map.KeyDeserializer并覆盖该方法
public Object deserializeKey(String key, DeserializationContext ctxt) throws IOException, JsonProcessingException {...}
然后手动反序列化我的密钥,但再次从我的密钥类的toString()输出中反序列化.
这不是最佳方法(此方法依赖于toString()方法).有没有更好的办法?