Ошибка преобразования GSON, когда нулевое поле содержит подполя - PullRequest
0 голосов
/ 27 апреля 2018

Я пытаюсь проанализировать результат JSON из API плагинов Wordpress с использованием Retrofit2 и GSON. Я сгенерировал свой POJO с помощью известного веб-сайта и изменил его на следующую модель:

PluginsApiResponse.java

public class PluginsApiResponse {

    @SerializedName("plugins")
    @Expose
    private List<Plugin> plugins = null;

    public List<Plugin> getPlugins() {
        return plugins;
    }

    public void setPlugins(List<Plugin> plugins) {
        this.plugins = plugins;
    }
}

Plugin.java

public class Plugin {

    @SerializedName("name")
    @Expose
    private String name;
    @SerializedName("homepage")
    @Expose
    private String homepage;
    @SerializedName("screenshots")
    @Expose
    private Screenshots screenshots;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getHomepage() {
        return homepage;
    }

    public void setHomepage(String homepage) {
        this.homepage = homepage;
    }

    public Screenshots getScreenshots() {
        return screenshots;
    }

    public void setScreenshots(Screenshots screenshots) {
        this.screenshots = screenshots;
    }

}

Screenshots.java

public class Screenshots {

    @SerializedName("1")
    @Expose
    private com.dkalsan.retrofitwordpress._1 _1;
    @SerializedName("2")
    @Expose
    private com.dkalsan.retrofitwordpress._2 _2;
    @SerializedName("3")
    @Expose
    private com.dkalsan.retrofitwordpress._3 _3;

    public com.dkalsan.retrofitwordpress._1 get1() {
        return _1;
    }

    public void set1(com.dkalsan.retrofitwordpress._1 _1) {
        this._1 = _1;
    }

    public com.dkalsan.retrofitwordpress._2 get2() {
        return _2;
    }

    public void set2(com.dkalsan.retrofitwordpress._2 _2) {
        this._2 = _2;
    }

    public com.dkalsan.retrofitwordpress._3 get3() {
        return _3;
    }

    public void set3(com.dkalsan.retrofitwordpress._3 _3) {
        this._3 = _3;
    }

}

_1.java (_2.java и _3.java идентичны)

public class _1 {

    @SerializedName("src")
    @Expose
    private String src;
    @SerializedName("caption")
    @Expose
    private String caption;

    public String getSrc() {
        return src;
    }

    public void setSrc(String src) {
        this.src = src;
    }

    public String getCaption() {
        return caption;
    }

    public void setCaption(String caption) {
        this.caption = caption;
    }

}

Проблема возникает в том случае, если в поле снимки экрана нет записей. Я настроил HttpLoggingInterceptor, который регистрирует код ответа 200 и json в полном объеме. Я также исключил возможность возникновения проблемы с подключением к Интернету в соответствии со следующей статьей . Если я удаляю поле скриншотов из модели, нет проблем при разборе. Возможно ли, что ошибка сохраняется из-за того, что GSON пытается десериализовать несуществующие поля 1 , 2 и 3 , и если да, то как с этим бороться?

1 Ответ

0 голосов
/ 27 апреля 2018

Оказалось, проблема была в форматировании ответа JSON. Если скриншотов не было, он был отформатирован как массив JSON, в противном случае он был отформатирован как объект JSON, содержащий объекты 1, 2, 3 и т. Д. Мне удалось исправить это, следуя ответу на этот вопрос stackoverflow .

...