2015-02-24 79 views
1

鑑於以下結構:遞歸型適配器GSON

abstract class Message { 
    Message anotherMessage; 
    String attribute; //just random stuff 
} 

我想有以下JSON字符串作爲輸出:

{type=Class.getSimpleName(), data=gson(Message)} 

作爲消息是抽象的,並且可以具有多個實現。問題是,「anotherMessage」不會有結構類型,數據。

我實現序列化的:

public JsonElement serialize(final Message src, final Type typeOfSrc, 
    final JsonSerializationContext context) { 
    Gson gson = new Gson(); 
    JsonObject elem = new JsonObject(); 
    elem.addProperty("type", src != null ? src.getClass().getSimpleName() : null); 
    elem.addProperty("data", src != null ? gson.toJson(src) : null); 
    return elem; 
} 

我怎樣才能做到這一點遞歸?我無法獲得帶有已附加消息適配器的Gson對象(stackoverflow-exception)

回答

1

在序列化/反序列化過程中,可以使用JsonSerializationContext/JsonDeserializationContext來序列化/反序列化另一個對象。

Message.java

abstract class Message { 
    Message anotherMessage; 
    String theMessage; 

    public Message getAnotherMessage() { 
     return anotherMessage; 
    } 

    public String getTheMessage() { 
     return theMessage; 
    } 
} 

Info.java

public class InfoMessage extends Message { 
    public InfoMessage(Message anotherMessage, String theMessage) { 
     this.anotherMessage = anotherMessage; 
     this.theMessage = theMessage; 
    } 
} 

Alert.java

public class AlertMessage extends Message { 
    public AlertMessage(Message anotherMessage, String theMessage) { 
     this.anotherMessage = anotherMessage; 
     this.theMessage = theMessage; 
    } 
} 

ErrorMessage.java

public class ErrorMessage extends Message { 
    public ErrorMessage(Message anotherMessage, String theMessage) { 
     this.anotherMessage = anotherMessage; 
     this.theMessage = theMessage; 
    } 
} 

MessageSerializer.java

public JsonElement serialize(Message src, Type typeOfSrc, JsonSerializationContext context) { 
    JsonObject elem = new JsonObject(); 

    if (src == null) { 

    } else { 
     elem.addProperty("type", src.getClass().getSimpleName()); 
     elem.addProperty("attribute", src.getTheMessage()); 
     elem.add("data", src.anotherMessage != null ? context.serialize(src.anotherMessage, Message.class): null); 
    } 

    return elem; 
} 

Test.java

public static void main(String[] args) { 
     Gson gson = new GsonBuilder() 
          .registerTypeAdapter(Message.class, new MessageSerializer()) 
          .setPrettyPrinting() 
          .create(); 

     String json = gson.toJson(
          new InfoMessage(
            new AlertMessage(
              new ErrorMessage(null, "the error message"), 
              "the alert message"), 
            "the info message"), 
          Message.class); 
     System.out.println(json); 

}