没有自定义反序列化器
如果你无法更改JSON以返回所需内容,建议创建与之匹配的类:
MyRider:
public class MyRider {
private String playerId;
private String name;
private int age;
private String nation;
private List<Rating> ratings;
private TeamInfo teaminfo;
}
评级:
public class Rating {
private String type;
private String score;
}
团队信息:
private static class TeamInfo {
private String teamName;
private String isValid;
}
然后,只需像平常一样反序列化即可:
MyRider rider = gson.fromJson(json, MyRider.class)
如果你需要在你的问题中精确地使用MyRider中指定的字段,考虑使用一个变换器类将上面的完整类映射到你的需求。
使用自定义反序列化器
使用自定义反序列化器也是可行的,但有点毫无意义,因为GSON已经为你提供了常规映射,你只需要进行相应的适配即可。
下面是一个使用反序列化器的例子:
public class MyRiderDeserializer implements JsonDeserializer<MyRider> {
@Override
public MyRider deserialize(JsonElement json, Type typeOfT,
JsonDeserializationContext context)
throws JsonParseException {
MyRider rider = new MyRider();
if(json.isJsonObject()) {
JsonObject riderObj = json.getAsJsonObject();
rider.setPlayerId(riderObj.get("playerId").getAsString());
rider.setName(riderObj.get("name").getAsString());
rider.setAge(riderObj.get("age").getAsInt());
JsonArray ratingsArray = riderObj.get("ratings").getAsJsonArray();
for(JsonElement ratingElem : ratingsArray) {
JsonObject ratingObj = ratingElem.getAsJsonObject();
String type = ratingObj.get("type").getAsString();
switch(type) {
case "speed":
rider.setSpeed(ratingObj.get("score").getAsString());
break;
case "accuracy":
rider.setAccuracy(ratingObj.get("score").getAsString());
break;
default:
break;
}
}
JsonObject teamInfo = riderObj.get("teaminfo").getAsJsonObject();
rider.setTeamName(teamInfo.get("teamName").getAsString());
rider.setIsValid(teamInfo.get("isValid").getAsString());
}
return rider;
}
}
请注意,此处不包括任何验证属性是否实际存在的检查,这是我能想到的最简单的自定义反序列化器。要使用它,您必须在 Gson
创建时注册类型适配器:
Gson gson = new GsonBuilder()
.registerTypeAdapter(MyRider.class, new MyRiderDeserializer())
.create();
MyRider myRider = gson.fromJson(reader, MyRider.class);