所以,我有配置
.defaultTyping(NON_FINAL)
将正确的序列化 json 编写为:
"headers": [
"org.springframework.messaging.MessageHeaders",
{
现在,问题是 MessageHeaders 类正在实现 Map,但也重写了 put 方法,因此它引发异常。为了正确地反序列化它,我需要能够将其序列化为 HashMap,所以:
"headers": [
"java.util.HashMap",
{
或者能够将 MessageHeaders 显式反序列化为 HashMap(因为它实际上只是 Map。
还有一个问题是:如何将实现 Map 的对象序列化为 HashMap,或者如何将实现 Map 的对象反序列化为 HashMap。
最佳答案
好的,我找到了如何使用自定义序列化程序执行此操作(技巧是告诉序列化程序使用 java.util.HashMap 而不是真正的类名):
public class MessageHeadersJsonSerializer extends JsonSerializer<MessageHeaders>{
@Override
public void serializeWithType(MessageHeaders value, JsonGenerator gen, SerializerProvider serializers, TypeSerializer typeSer) throws IOException {
typeSer.writeTypePrefixForObject(value, gen, HashMap.class);
serialize(value, gen, serializers);
typeSer.writeTypeSuffixForObject(value, gen);
}
@Override
public void serialize(MessageHeaders value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
for(Map.Entry<String, Object> entry : value.entrySet()){
gen.writeFieldName(entry.getKey());
gen.writeObject(entry.getValue());
}
}
}
然后将其注册为 MixIn:
@JsonSerialize(using = MessageHeadersJsonSerializer.class)
public abstract class MessageHeadersMixIn {}
在父对象上,我将其反序列化为 HashMap:
public abstract class GenericMessageMixIn<T> {
@JsonCreator
public GenericMessageMixIn(
@JsonProperty("payload") T payload,
@JsonProperty("headers") Map<String, Object> headers
){}
}
最后一切正常!
关于java - Jackson - 将 Map 实现反序列化为 HashMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41063262/