Spring项目中使用jackson序列化key为对象Map
1.注入ObjectMapper
2.注册类HistoricTaskInstance的序列化和反序列化类HistoricTaskInstanceKeySerializer,HistoricTaskInstanceKeyDeSerializer
3.将新的Modeule注册到ObjectMapper中。
class A{
//1.注入ObjectMapper,注意这个ObjectMapper是spring全局的。 @Autowired private ObjectMapper objectMapper; public void setKeyProcessor(){
SimpleModule sm = new SimpleModule();
//注册序列化,反序列化类。
sm.addKeySerializer(HistoricTaskInstance.class,new HistoricTaskInstanceKeySerializer());
sm.addKeyDeserializer(HistoricTaskInstance.class,new HistoricTaskInstanceKeyDeSerializer());
//注册到ObjectMapper中。
objectMapper.registerModule(sm);
}
}
static class HistoricTaskInstanceKeySerializer extends JsonSerializer<HistoricTaskInstance> {
private final ObjectMapper objectMapper = new ObjectMapper();
@Override
public void serialize(HistoricTaskInstance historicTaskInstance, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
StringWriter writer = new StringWriter();
objectMapper.writeValue(writer, historicTaskInstance);
jsonGenerator.writeFieldName(writer.toString());
}
}
static class SimpleObjectKeyDeSerializer extends KeyDeserializer {
private final ObjectMapper objectMapper = new ObjectMapper();
@Override
public HistoricTaskInstance deserializeKey(String key, DeserializationContext deserializationContext) throws IOException {
return objectMapper.readValue(key, HistoricTaskInstance.class);
}
}
class HistoricTaskInstance{
private String name;
private String address;
}