使用JacksonXML将对象映射到子类

时间:2018-12-25 15:16:20

标签: java json jackson

对象在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);

1 个答案:

答案 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了解更多详细信息。