当使用 jackson 序列化 Map< ObjectA, ObjectB> 对象时,ObjectA 默认会以 toString 的方式来序列化,而在反序列化时,则会直接失败。这个问题,该如何解决呢?
jackson 提供额外的接口供我们扩展,网上以 2.x 版本为例的解决方案很多,1.x 的比较少,这里主要说 1.x 版本的解决方案。
在 jackson 里提供了 JsonSerializer 和 KeyDeserializer 抽象类,针对需要特殊处理的对象 ObjectA,提供对应的实现类,并调用 objectMapper.registerModule 方法注册进去即可。完整示例代码如下所示:
public class JsonUtil {
private final static ObjectMapper objectMapper = new ObjectMapper();
private final static JsonFactory jsonFactory = objectMapper.getJsonFactory();
static {
objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
// 将特殊的序列化和反序列化类添加到 objectMapper
SimpleModule simpleModule = new SimpleModule("SimpleObject", Version.unknownVersion());
simpleModule.addKeySerializer(SimpleObject.class, new SimpleObjectKeySerializer());
simpleModule.addKeyDeserializer(SimpleObject.class, new SimpleObjectKeyDeSerializer());
objectMapper.registerModule(simpleModule);
}
public static class SimpleObjectKeySerializer extends JsonSerializer<SimpleObject> {
@Override
public void serialize(SimpleObject SimpleObject, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
StringWriter writer = new StringWriter();
objectMapper.writeValue(writer, SimpleObject);
jsonGenerator.writeFieldName(writer.toString());
}
}
public static class SimpleObjectKeyDeSerializer extends KeyDeserializer {
@Override
public SimpleObject deserializeKey(String key, DeserializationContext deserializationContext) throws IOException {
return objectMapper.readValue(key, SimpleObject.class);
}
}
public static class SimpleObject {
private String key;
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
}
}
jackson 2.x 版本的解决方案看此处:https://www.baeldung.com/jackson-map。