gpt4 book ai didi

java - Jackson - 将 Map 实现反序列化为 HashMap

转载 作者:行者123 更新时间:2023-11-30 07:00:09 27 4
gpt4 key购买 nike

所以,我有配置

.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/

27 4 0
文章推荐: java - 从外部 clojar 导入/使用资源
文章推荐: Java 重构具有多态性的互连 switch/if 语句
文章推荐: java - 类型不匹配 : cannot convert from Set to Set