Gson 2.2.2无法序列化Object1中的字段。
public class Test {
public static void main(String[] args){
Object1 o1 = new Object1();
List<Interface1> list1 = new ArrayList<Interface1>();
Interface1 f1 = new InterfaceImp();
list1.add(f1);
o1.field = list1;
System.out.println(new Gson().toJson(o1));
}
}
interface Interface1{}
class InterfaceImp implements Interface1{
public String s = "123";
}
class Object1 {
public List<? extends Interface1> field ;
}
在debuging时,我在 TypeAdapterRuntimeTypeWrapper 中找到了方法:
private Type getRuntimeTypeIfMoreSpecific(Type type, Object value) {
if (value != null && (type == Object.class || type instanceof TypeVariable<?> || type instanceof Class<?>)) {
type = value.getClass();
}
return type;
}
不返回value.getClass()。 arg'type'(?extends Interface1 )使得if测试变得非常好。一个错误?
答案 0 :(得分:0)
我认为您需要指定您在列表
中使用的通用类型检查此链接
https://sites.google.com/site/gson/gson-user-guide#TOC-Collections-Examples
例如,序列化列表:
Type type = new TypeToken<List<Interface1>>(){}.getType();
String s = new Gson().toJson(list1, type);
工作代码(已测试)
public static void main(String[] args) {
Object1 o1 = new Object1();
List<Interface1> list1 = new ArrayList<Interface1>();
Interface1 f1 = new InterfaceImp();
list1.add(f1);
list1.add(f1);
o1.field = list1;
String s = getGsonWithAdapters().toJson(o1);
System.out.println(s);
}
public static Gson getGsonWithAdapters() {
GsonBuilder gb = new GsonBuilder();
gb.serializeNulls();
gb.registerTypeAdapter(Object1.class, new CustomAdapter());
return gb.create();
}
public static class CustomAdapter implements JsonSerializer<Object1> {
@Override
public JsonElement serialize(Object1 obj, Type type,
JsonSerializationContext jsc) {
JsonObject jsonObject = new JsonObject();
Type t = new TypeToken<List<Interface1>>() {}.getType();
jsonObject.add("field", new Gson().toJsonTree(obj.field, t));
return jsonObject;
}
}