将JSON数据解析为一个类

11 浏览
0 Comments

将JSON数据解析为一个类

类:

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": [

{

"type": 0,

"text": "Text 1"

},

{

"type": 1,

"question": "Text 2"

} ] }

解析器:

ArrayList getList(){
    Gson gson = new Gson();
    MyListsArray mLists = gson.fromJson(bufferString, MyListsArray.class);
    return mLists.list;
}

用于保存列表项的类:

public class MyListsArray {
    public ArrayList list;
}

一切都顺利进行,我得到了JSON字符串中出现的类型和文本的正确值。但是arr仍然为null。

0
0 Comments

问题原因:GSon在代码中没有调用MyList类的构造函数,所以arr得到了默认值null。

解决方法:在MyList类中添加一个无参构造函数。

0
0 Comments

解析JSON数据并将其转换为类是在处理JSON数据时经常遇到的问题。有时候,我们可能需要将JSON数据转换为自定义的类对象,以便更方便地处理数据。本文将介绍为什么会出现这个问题以及解决方法。

问题的原因是,当我们使用Gson库来解析JSON数据时,如果目标类没有无参构造函数,并且我们没有注册任何InstanceCreator对象,Gson库将使用UnsafeAllocator来创建目标类的实例。UnsafeAllocator使用反射来获取sun.misc.Unsafe类的allocateInstance方法来创建目标类的实例。然而,如果目标类有无参构造函数,Gson库将使用ObjectConstructor来创建目标类的实例,该ObjectConstructor使用默认构造函数来创建实例。

为了解决这个问题,我们可以创建一个自定义的反序列化器(CustomDeserializer),并在其中指定如何将JSON数据转换为目标类的对象。下面是一个示例CustomDeserializer的代码:

class CustomDeserializer implements JsonDeserializer> {
    public List deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext context) throws JsonParseException {
       JsonArray jsonArray = jsonElement.getAsJsonObject().getAsJsonArray("list");
       List 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;
    }
}

在上述代码中,我们首先从JSON数据中获取一个名为"list"的JsonArray。然后,我们使用Gson库将每个JsonElement转换为MyList类的对象,并根据其type属性的值来设置MyList对象的arr属性。最后,我们将转换后的MyList对象添加到一个List中并返回。

最后,我们可以使用上述自定义的反序列化器来解析JSON数据并将其转换为List对象。下面是一个示例代码:

Type typeOf = new TypeToken>(){}.getType();
Gson gson = new GsonBuilder().registerTypeAdapter(typeOf, new CustomDeserializer()).create();
List list = gson.fromJson(builder.toString(), typeOf);

在上述代码中,我们首先创建一个Type对象,用于指定目标类的类型。然后,我们使用GsonBuilder来注册自定义的反序列化器,并创建一个Gson对象。最后,我们使用Gson对象的fromJson方法将JSON数据转换为List对象。

通过以上的解决方法,我们可以方便地将JSON数据解析为自定义的类对象,并进行进一步的处理和操作。

0