我有一个来自外部API的json对象,它具有以下形式的对象“列表”:
{
"width": 10,
"height": 20
"pointData": {
"0": {
"x": 7,
"y": 5,
...
},
"1": {
"x": 4,
"y": 20,
...
},
"2": {
"x": 1,
"y": 3,
...
},
...
}
}
我的解串器和POJO看起来像这样:
class KeyedListDeserializer<T> implements JsonDeserializer<List<T>> {
@Override
public List<T> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
JsonObject jsonObject = json.getAsJsonObject();
List<T> things = new ArrayList<>();
int key = 0;
while (jsonObject.has(String.valueOf(key))) {
JsonElement element = jsonObject.get(String.valueOf(key));
T value = context.deserialize(element, new TypeToken<T>(){}.getType());
things.add(value);
key += 1;
}
return things;
}
}
class PointDataKeyedList extends KeyedListDeserializer<PointData> {}
class Canvas {
int width;
int height;
@JsonAdapter(PointDataKeyedList.class)
List<PointData> pointData;
...
}
class PointData {
int x;
int y;
...
}
由于pointData
对象的所有键都是索引,所以我想我可以将其反序列化为列表而不是Map。运行此函数时,Gson成功地完成了反序列化,但当我尝试访问点数据时,我得到了一个:
Exception in thread "main" java.lang.ClassCastException: class com.google.gson.internal.LinkedTreeMap cannot be cast to class PointData (com.google.gson.internal.LinkedTreeMap and PointData are in unnamed module of loader 'app')
我不知道这里出了什么问题,我读过一些关于类型擦除的文章,这是我在搜索这个问题时经常听到的,但我真的不太理解它。
2条答案
按热度按时间l5tcr1uw1#
在Gson很容易
上面的类型适配器工厂执行以下操作:
List
(它实际上不适用于链表,但可以简化);add(element)
方法忽略index
值。只需使用
@JsonAdapter(MapToListTypeAdapterFactory.class)
注解Canvas
类中的pointData
字段,它就可以工作。1l5u6lss2#
我怕你的POJO课程需要像
并且可以去掉PointDataKeyedList和KeyedListDeserializer,