如何解决在GSON中反序列化递归多态类
要反序列化JSON,您需要为递归接口使用自定义反序列化器。在这种类中,您需要检查JSON并确定要实例化为JSON本身的type字段的类。在这里,您有一个我为您编写的示例基本解串器。
当然,管理边界事件可以得到改善(例如,如果没有类型字段,会发生什么情况?)。
package stackoverflow.questions;
import java.lang.reflect.Type;
import java.util.*;
import stackoverflow.questions.Q20254329.*;
import com.google.gson.*;
import com.google.gson.reflect.Typetoken;
public class Q20327670 {
static class Complex implements Recursive {
Map<String, Recursive> map;
@Override
public String toString() {
return "Complex [map=" + map + "]";
}
}
static class Simple implements Recursive {
@Override
public String toString() {
return "Simple []";
}
}
public static class RecursiveDeserializer implements JsonDeserializer<Recursive> {
public Recursive deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
Recursive r = null;
if (json == null)
r = null;
else {
JsonElement t = json.getAsJsonObject().get("type");
String type = null;
if (t != null) {
type = t.getAsstring();
switch (type) {
case "complex": {
Complex c = new Complex();
JsonElement e = json.getAsJsonObject().get("map");
if (e != null) {
Type mapType = new Typetoken<Map<String, Recursive>>() {}.getType();
c.map = context.deserialize(e, mapType);
}
r = c;
break;
}
case "simple": {
r = new Simple();
break;
}
// remember to manage default..
}
}
}
return r;
}
}
public static void main(String[] args) {
String json = " { " +
" \"type\" : \"complex\", " +
" \"map\" : { " +
" \"a\" : { " +
" \"type\" : \"simple\" " +
" }, " +
" \"b\" : { " +
" \"type\" : \"complex\", " +
" \"map\" : { " +
" \"ba\" : { " +
" \"type\" : \"simple\" " +
" } " +
" } " +
" } " +
" } } ";
GsonBuilder gb = new GsonBuilder();
gb.registerTypeAdapter(Recursive.class, new RecursiveDeserializer());
Gson gson = gb.create();
Recursive r = gson.fromJson(json, Recursive.class);
System.out.println(r);
}
}
这是我的代码的结果:
Complex [map={a=Simple [], b=Complex [map={ba=Simple []}]}]
解决方法
class Complex implements Recursive {
Map<String,Recursive> map;
...
}
class Simple implements Recursive { ... }
我如何反序列化此json:
{
"type" : "complex","map" : {
"a" : {
"type" : "simple"
},"b" : {
"type" : "complex","map" : {
"ba" : {
"type" : "simple"
}
}
}
}
使用Google GSON?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。