Без пользовательского десериализатора
Если вы не можете изменить JSON так, чтобы он возвращал именно то, что вы хотите, я предлагаю вам создать классы, соответствующие ему:
MyRider:
public class MyRider {
private String playerId;
private String name;
private int age;
private String nation;
private List<Rating> ratings;
private TeamInfo teaminfo;
// getters, setters, toString override
}
Оценка:
public class Rating {
private String type;
private String score;
// getters, setters, toString override
}
TeamInfo:
private static class TeamInfo {
private String teamName;
private String isValid;
// getters, setters, toString override
}
Затем просто десериализовать как обычно:
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);