[英]Recursive Type-Adapter GSON
给出以下结构:
abstract class Message {
Message anotherMessage;
String attribute; //just random stuff
}
我想将以下json-string作为输出:
{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对象(stackoverflow-exception)
在序列化/反序列化期间可以使用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);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.