gpt4 book ai didi

java - 使用 JacksonXML 将对象映射到子类

转载 作者:行者123 更新时间:2023-12-02 10:26:31 25 4
gpt4 key购买 nike

我在将 JSON 字符串对象映射到 Java 中的子类时遇到问题。我有一个 Message 类,其中包含一个 MessageType 和一个包含消息内容的 String

public class Message {
protected MessageType messageType;
protected String content;

public MessageType getMessageType() {
return messageType;
}

public String getContent() {
return content;
}

public void setMessageType(MessageType messageType) {
this.messageType = messageType;
}

public void setContent(String content) {
this.content = content;
}
}

还有一种特殊的消息,这种消息包含一个额外的变量。我将此消息设为 Message 类的子类:

public class QuestionMessage extends Message {

private Question question;

public QuestionMessage() {

}

public Question getQuestion() {
return question;
}

public void setQuestion(Question question) {
this.question = question;
}
}

问题类别定义为:

public class Question {
private String question;
private String answerA;
private String answerB;
private String answerC;
private String correctAnswer;

//Getters and setters down here.
}

在代码的其他地方,我收到一个 JSON 字符串,并使用 Jackson 的 ObjectMapper 将此字符串映射到 Message 类:

objectMapper.readValue(jsonString, Message.class);

现在有时 JSON 字符串是普通消息,例如:

{"messageType":"NORMAL","content":"Content string"}

此 JSON 字符串已成功映射到 Message 类,并返回一个 Message 对象。但是,当我的代码收到特殊消息时,例如:

{"messageType":"NEW_QUESTION", "content":"Content String","question":{"question":"123","answerA":"123","answerB":"123","answerC":"123"}}

不幸的是,我的代码无法将后一个 json 消息映射到 QuestionMessage 类上。是否可以使用 JacksonXML 映射到您提供给对象映射器的类(Message.class)的子类(QuestionMessage)?

或者这是不可能的,我是否必须首先在传入的 json 字符串中搜索“问题”节点,然后专门调用:

objectMapper.readValue(jsonString, QuestionMessage.class);

而不是

objectMapper.readValue(jsonString, Message.class);

最佳答案

您可以自定义一个Deserializer来检查是否存在question节点。

例如:

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;

import java.io.IOException;

public class MessageDeserializer extends StdDeserializer<Message> {

public MessageDeserializer() {
this(null);
}

public MessageDeserializer(Class<?> vc) {
super(vc);
}

@Override
public Message deserialize(JsonParser jp, DeserializationContext ctxt)
throws IOException, JsonProcessingException {
JsonNode node = jp.getCodec().readTree(jp);
JsonNode questionNode = node.findValue("question");

if (questionNode != null) {
Question questionMessage = new Question();
...
return questionMessage;
} else {
Message message = new Message();
...
return message;
}
}
}

并使用它:

ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addDeserializer(Message.class, new MessageDeserializer());
mapper.registerModule(module);

Message readValue = mapper.readValue(json, Message.class);

检查here了解更多详情。

关于java - 使用 JacksonXML 将对象映射到子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53923550/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com