使用gson反序列化json数组?

时间:2014-12-27 10:54:20

标签: gson deserialization json-deserialization

我的json是:

{
   "status": 200,
   "data": [
       {
            "catId": 638,
            "catName": "Helena Bonham Carter",
            "catUniqueName": "helena-bonham-carter",
            "catSlug": ""
       },
       {
        ...
       }
   ]
}

我的分类模型为:

public class Category {

    private double catId;
    private String catName;
    private String catUniqueName;
    private String catSlug;
}

我的gson自定义反序列化器如下:

Type listType = new TypeToken<ArrayList<Category>>(){}.getType();

Gson gson = new GsonBuilder()
            .registerTypeAdapter(listType, new CategoryDeserializer())
            .create();

private class CategoryDeserializer implements JsonDeserializer {
    @Override
    public Category deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
            throws JsonParseException {
        Gson gson = new Gson();
        return gson.fromJson(((JsonObject) json).get("data"), typeOfT);
    }
}

我正在使用Retrofit库,它使用gson序列化/反序列化json对象。我通过这个自定义gson反序列化器进行改造,但它给了我一个错误。你能告诉我在去骨化的时候我哪里出错吗?

错误:

java.util.ArrayList cannot be cast to com.compzets.app.models.Category

预期结果:

我想要来自json的ArrayList of Category

2 个答案:

答案 0 :(得分:3)

deserialize()的返回类型从Category更改为ArrayList<Category>解决了这个问题。其余的代码是正确的。

答案 1 :(得分:2)

您似乎只是尝试从JSON中提取ListCategory个对象。您需要使用解串器来执行此操作,并相应地使用TypeToken来注册解串器。

这是一个完整的工作示例。显然你可以根据需要改变类范围;我更改了它们以使其成为单个文件示例。

public class App 
{
    public static void main( String[] args )
    {
        String json = "{\n" +
            "   \"status\": 200,\n" +
            "   \"data\": [\n" +
            "       {\n" +
            "            \"catId\": 638,\n" +
            "            \"catName\": \"Helena Bonham Carter\",\n" +
            "            \"catUniqueName\": \"helena-bonham-carter\",\n" +
            "            \"catSlug\": \"\"\n" +
            "       }\n" +
            "   ]\n" +
            "}";

        Type listType = new TypeToken<List<Category>>(){}.getType();
        Gson gson = new GsonBuilder().registerTypeAdapter(listType, new CategoryDeserializer()).create();

        List<Category> list = gson.fromJson(json, listType);

        for (Category c : list)
        {
            System.out.println("CatId: " + c.catId);
        }


    }

    public static class CategoryDeserializer implements JsonDeserializer<List<Category>>
    {

        public List<Category> deserialize(JsonElement je, Type type, JsonDeserializationContext jdc) throws JsonParseException
        {
            JsonArray data = je.getAsJsonObject().getAsJsonArray("data");
            ArrayList<Category> myList = new ArrayList<Category>();

            for (JsonElement e : data)
            {
                myList.add((Category)jdc.deserialize(e, Category.class));
            }

            return myList;

        }

    }

    public static class Category
    {
        public double catId;
        public String catName;
        public String catUniqueName;
        public String catSlug;
    }

}

输出:

  

CatId:638.0