2016-06-10 13 views
0

Ich nehme Code auf, den jemand anders geschrieben hat, und es fällt mir schwer zu verstehen, wie ich auf die Kindklasse zugreifen kann.Zugriff auf JSON Polymorphe POJO-Klasse

Geordnete Klasse:

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

Kinderklasse:

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

Kinderklasse:

package blah.blah.blah; 

public class SMSMessage extends Message { 
} 

Ich habe eine Instanz der Nachricht, die von einer JSON-Nachricht zugeordnet wurde, aber ich kann nicht Finde heraus, wie du auf das Feld "Typ" zugreifen kannst und wie du auf das Feld "Betreff" zugreifen kannst (wenn es sich um eine E-Mail handelt).

JSON:

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

Was ich habe versucht:

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

, die in der Regel in Code bedeutet, dass Sie sth wie 'if (Meldung Instanceof Emailmessage) zu tun haben, {.. Guss ..}' – zapl

+0

Sie haben eine Instanz von Message oder eine Liste der Nachrichten? Auf jeden Fall, was hast du probiert? –

+0

Ich habe es gerade mit dem, was ich versucht habe, aktualisiert. Es gibt eine Liste von Nachrichten und ich erhalte die erste, um zu sehen, ob ich den Typ bekommen kann. –

Antwort

1

Thanks @ cricket_007 und @zapl für die Antwort in den Kommentaren. Fühlen Sie sich frei, diese Antwort zu schreiben, und ich werde Ihre akzeptieren. Aber hier ist, was ich jetzt habe, das funktioniert.

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

    }