将JSON数据解析为类

时间:2014-04-15 11:33:02

标签: java json gson

类别:

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仍然是空的。

2 个答案:

答案 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