【问题标题】:Jackson - deserializing Map implementation as HashMapJackson - 将 Map 实现反序列化为 HashMap
【发布时间】:2016-12-09 15:02:34
【问题描述】:

所以,我有配置

.defaultTyping(NON_FINAL)

将正确序列化的 json 编写为:

"headers": [
        "org.springframework.messaging.MessageHeaders",
        {

现在,问题是 MessageHeaders 类正在实现 Map,但也覆盖了 put 方法,因此它会引发异常。为了正确反序列化,我需要能够将其序列化为 HashMap,所以:

"headers": [
        "java.util.HashMap",
        {

或者能够将 MessageHeaders 显式反序列化为 HashMap(因为它实际上只是 Map。

还有一个问题:如何将实现 Map 的 Object 序列化为 HashMap,或者如何将实现 Map 的 Object 反序列化为 HashMap。

【问题讨论】:

  • 你试过@JsonDeserialize(as = java.util.HashMap.class) 注解吗?
  • 是的,我做到了。抛出的异常是MessageHeaders不能反序列化为HashMap。 MessageHeaders 仅实现 Map 接口。在内部,它具有最终的 Map headers 属性,用于存储此值。
  • 我也试过 @JsonSerialize(as=Map.class) 但我认为默认类型 NON_FINAL 优先

标签: java json serialization jackson deserialization


【解决方案1】:

好的,我找到了如何使用自定义序列化程序来做到这一点(诀窍是告诉序列化程序使用 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
    ){}
}

最后一切正常!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-05
    • 2023-03-04
    • 2017-01-02
    • 1970-01-01
    • 2017-05-09
    • 1970-01-01
    • 2014-05-19
    • 1970-01-01
    相关资源
    最近更新 更多