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

Здесь используется Retrofit для использования Google Civic API.

Библиотека требует, чтобы вы создали модель того, что будет возвращать API, как я уже сделал с Election. Это в основном копия документации Google.

(Модернизация связывает свойства ответа со свойствами с тем же именем)

Выборы.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 десериализовать модель, которая фиксирует переменную с именем свойства после ключа деления?


person Simulan88    schedule 10.05.2017    source источник
comment
Вы пробовали Map<K,V>?   -  person Lyubomyr Shaydariv    schedule 10.05.2017


Ответы (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 сможет сериализовать и десериализовать ваши объекты. Класс Divisions — это корень json, который вы нам дали в вопросе.

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

person Fred    schedule 11.05.2017
comment
Никогда не думал, что буду рад увидеть появление Трампа в моем приложении, черт возьми, это заняло слишком много времени, спасибо! Использование Map в моей модели Division привело к десериализации всего. - person Simulan88; 11.05.2017