【问题标题】:Recursive Type-Adapter GSON递归类型适配器 GSON
【发布时间】:2015-02-24 12:39:26
【问题描述】:

给定以下结构:

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

我希望输出以下 json 字符串:

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

因为 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-Object(stackoverflow-exception)

【问题讨论】:

    标签: java android gson


    【解决方案1】:

    可以在序列化/反序列化过程中使用 JsonSerializationContext/JsonDeserializationContext 来序列化/反序列化另一个对象。

    消息.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);
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-18
      • 1970-01-01
      • 2016-04-17
      • 2013-06-05
      相关资源
      最近更新 更多