Десериализовать свойство объекта с непоследовательным именем?
Используя Retrofit здесь, чтобы использовать Google Civic API.
Библиотека требует от вас создать модель того, что API будет возвращать, как я уже делал с Election. Который в основном является копией документации Google.
(Retrofit привязывает свойства ответа к свойствам с тем же именем)
Election.Java:
public class Election {
private long id;
private String name;
private String electionDay;
private String ocdDivisionId;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getElectionDay() {
return electionDay;
}
public void setElectionDay(String electionDay) {
this.electionDay = electionDay;
}
public String getOcdDivisionId() {
return ocdDivisionId;
}
public void setOcdDivisionId(String ocdDivisionId) {
this.ocdDivisionId = ocdDivisionId;
}
}
Но представители имеют противоречивое имя свойства, поэтому я не вижу способа смоделировать это таким образом, чтобы Retrofit знал, как десериализовать ответ API.
Представители объекта (JSON):
имя свойства называется (ключ)
Как я могу позволить Retrofit десериализовать модель, которая захватывает свойство с именем variable после ключа деления?
1 ответ
Предполагая, что вы используете Gson
конвертер, я бы лично использовал карту. Я думаю, что то же самое может быть достигнуто с другими конвертерами, но я никогда не использовал их. Скажем, у вас есть следующий объект:
public class Division {
@SerializedName("name")
@Expose
private String name;
@SerializedName("alsoKnownAs")
@Expose
private List<String> alsoKnownAs = new ArrayList<>();
@SerializedName("officeIndices")
@Expose
private List<Integer> officeIndices = new ArrayList<>();
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<String> getAlsoKnownAs() {
return alsoKnownAs;
}
public void setAlsoKnownAs(List<String> alsoKnownAs) {
this.alsoKnownAs = alsoKnownAs;
}
public List<Integer> getOfficeIndices() {
return officeIndices;
}
public void setOfficeIndices(List<Integer> officeIndices) {
this.officeIndices = officeIndices;
}
}
Который представляет объект внутри divisions
массив. Вы можете иметь класс:
private class Divisions {
@SerializedName("divisions")
@Expose
private Map<String, Division> divisions = new HashMap<>();
// ...
}
Обратите внимание на использование карты здесь? За кулисами Gson сможет сериализовать и десериализовать ваши объекты. Разделение классов - это корень json, который вы дали нам в этом вопросе.
Надеюсь это поможет