我的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
。
答案 0 :(得分:3)
将deserialize()
的返回类型从Category
更改为ArrayList<Category>
解决了这个问题。其余的代码是正确的。
答案 1 :(得分:2)
您似乎只是尝试从JSON中提取List
个Category
个对象。您需要使用解串器来执行此操作,并相应地使用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