Десериализовать свойство объекта с непоследовательным именем?

Используя 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, который вы дали нам в этом вопросе.

Надеюсь это поможет

Другие вопросы по тегам