类别:
public class MyList {
public int type;
public String text;
public boolean[] arr;
public MyList(int type, String text) {
this.type = type;
this.text = text;
switch (type) {
case 0:
arr = new boolean[5];
break;
case 1:
arr = new boolean[10];
break;
}
}
}
JSON数据:
{" list":[ { "输入":0, "文字":"文字1" }, { "输入":1, "问题":"文字2" }]}
分析器:
ArrayList<MyList> getList(){
Gson gson = new Gson();
MyListsArray mLists = gson.fromJson(bufferString, MyListsArray.class);
return mLists.list;
}
保留列表项的类:
public class MyListsArray {
public ArrayList<MyList> list;
}
一切顺利,我得到了JSON字符串中存在的类型和文本的正确值。但是arr仍然是空的。
答案 0 :(得分:2)
GSon 从不在您的代码中调用MyList类的构造函数。这就是arr获取默认值的原因。这是 null 。
答案 1 :(得分:1)
您可以启动Json字符串中不存在的数据,如下所示写入CustomDeserializer
class CustomDeserializer implements JsonDeserializer<List<MyList>> {
@Override
public List<MyList> deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext context) throws JsonParseException {
JsonArray jsonArray = jsonElement.getAsJsonObject().getAsJsonArray("list");
List<MyList> list=new ArrayList<>(30);
Gson gson = new Gson();
for (JsonElement element : jsonArray) {
MyList ob = gson.fromJson(element, MyList.class);
switch (Integer.valueOf(ob.type)) {
case 0:
ob.arr = new boolean[5];
break;
case 1:
ob.arr = new boolean[10];
break;
}
list.add(ob);
}
return list;
}
最后解析它
Type typeOf = new TypeToken <List<MyList>>(){}.getType();
Gson gson = new GsonBuilder().registerTypeAdapter(typeOf, new CustomDeserializer()).create();
List<MyList> list = gson.fromJson(builder.toString(),typeOf);
Gson文档说,如果你的类没有no-args构造函数并且你没有注册任何InstanceCreater对象,那么它将使用UnsafeAllocator创建一个ObjectConstructor(它构造你的Object),它使用Reflection来获取类sun.misc.Unsafe的allocateInstance方法来创建你的类&#39;实例
如果你有一个no-args构造函数,Gson将使用一个ObjectConstructor,它通过调用
来使用默认的构造函数yourClassType.getDeclaredConstructor(); // ie. empty, no-args