【问题标题】:Access JSON Polymorphic POJO Class访问 JSON 多态 POJO 类
【发布时间】:2016-06-10 14:25:03
【问题描述】:

我正在挑选一些其他人编写的代码,但我很难理解如何访问子类。

父类:

package blah.blah.blah;

import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.JsonSubTypes;

import java.io.Serializable;
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXTERNAL_PROPERTY, property = "type")
@JsonSubTypes({
    @JsonSubTypes.Type(value = EmailMessage.class, name = "Email"),
    @JsonSubTypes.Type(value = SMSMessage.class, name = "SMS")
})    
public class Message implements Serializable {

   private static final long serialVersionUID = 1L;

   private String messageBody;

   public String getMessageBody() {
      return messageBody;
   }
   public void setMessageBody(String messageBody) {
      this.messageBody = messageBody;
   }
}

儿童班:

package blah.blah.blah;

public class EmailMessage extends Message {
   private String subject;

   public String getSubject() {
       return subject;
   }
   public void setSubject(String subject) {
       this.subject = subject;
   }
}

儿童班:

package blah.blah.blah;

public class SMSMessage extends Message {
}

我有一个从 JSON 消息映射的 Message 实例,但我不知道如何访问“类型”字段以及如何访问“主题”字段(如果是电子邮件)。

JSON:

"messageList": [{
    "type": "Email",
    "messageBody": "Email body",
    "subject": "Email subject"
}, {
    "type": "SMS",
    "messageBody": "SMS body"
}]

我尝试过的:

Message incomingMessage = messageList.getMessageList().get(0);
log.info("Message Body: " + incomingMessage.getMessageBody());

【问题讨论】:

  • 这通常意味着在代码中你必须像if (message instanceof EmailMessage) { .. cast .. }那样做某事
  • 您有消息实例或消息列表?无论如何,您尝试过什么?
  • 我刚刚用我尝试过的方法更新了它。有一个消息列表,我要第一个尝试看看我是否能得到类型。
  • 而且您不需要访问 type 字段(因为它没有在模型中公开)。您需要使用instanceof
  • @zapl 好的,这是有道理的。我只是想也许有办法说像 message.type()。

标签: java json spring jackson pojo


【解决方案1】:

感谢@cricket_007 和@zapl 在 cmets 中的回答。随意写下这个答案,我会接受你的。但这是我现在所拥有的。

    for (Message incomingMessage : messageInitRequest.getMessageList()) {

        if (incomingMessage instanceof EmailMessage) {

            EmailMessage emailMessage = (EmailMessage) incomingMessage;

            System.out.println("Type: Email");
            System.out.println(emailMessage.getMessageBody());
            System.out.println(emailMessage.getSubject());

        } else if (incomingMessage instanceof SMSMessage) {

            SMSMessage smsMessage = (SMSMessage) incomingMessage;

            System.out.println("Type: SMS");
            System.out.println(smsMessage.getMessageBody());
        }

    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-29
    • 1970-01-01
    • 1970-01-01
    • 2020-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-05
    相关资源
    最近更新 更多