对象在Java中将JSON字符串映射到子类时遇到问题。我有一个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,是否可以映射到您提供给objectmapper的类(QuestionMessage
)的子类(Message.class
)上?
或者这是不可能的,我首先必须在传入的json字符串中搜索“问题”节点,然后专门调用:
objectMapper.readValue(jsonString, QuestionMessage.class);
代替
objectMapper.readValue(jsonString, Message.class);
答案 0 :(得分:0)
您可以自定义<a href="/Produtos/Get/@produto.Slug">Link</a>
,以检查是否存在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;
}
}
}
检查here了解更多详细信息。