2016-06-10 42 views
0

我正在拾取別人編寫的一些代碼,我很難理解如何訪問子類。訪問JSON多態POJO類

父類:

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消息映射消息的一個實例,但我不能瞭解如何訪問「類型」字段以及如何訪問「主題」字段(如果是電子郵件)。

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()); 
+0

這通常意味着在代碼中,你必須做某事,比如'如果(消息的instanceof EmailMessage){..投..}' – zapl

+0

你有消息的實例或郵件的列表?無論如何,你有什麼嘗試? –

+0

我剛剛用我試過的方法更新了它。有一個消息列表,我得到第一個嘗試,看看我能否得到這個類型。 –

回答

1

感謝@ cricket_007和@zapl在評論答案。隨意寫這個答案,我會接受你的。但這是我現在正在工作的東西。

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()); 
     } 

    }