Два разных варианта модернизации

Я использую Дооснащение с POJO для отправки экрана регистрации, который обычно работает, но в ответе есть два разных объекта в зависимости от того, действителен ли результат. Которые:

{
    "errors": {
        "nome": [
            "Campo obrigatório"
        ],
        "sobrenome": [
            "Campo obrigatório"
        ]
    }
}

а также:

{
    "success": {
        "nome": [
            "Campo obrigatório"
        ],
        "sobrenome": [
            "Campo obrigatório"
        ]
    }
}

И мой POJO:

public class PostCadastro {

@SerializedName("nome")
@Expose
private String nome;
@SerializedName("sobrenome")
@Expose
private String sobrenome;

public String getNome() {
    return nome;
}

public void setNome(String nome) {
    this.nome = nome;
}

public String getSobrenome() {
    return sobrenome;
}

public void setSobrenome(String sobrenome) {
    this.sobrenome = sobrenome;
}

Как я могу справиться с этими двумя ответами?

1
0
647
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Я предполагаю, что PostCadastro - это объект, который вы используете для получения ответа API. В этом случае у вас нет переменной с именем «errors» или переменной с именем «success» для получения правильного ответа.

Имена переменных в вашем объекте ответа должны совпадать с первыми узлами в дереве JSON. В этом случае nome и sobrenome являются подузлами «errors» и «success», поэтому модификация будет искать переменную экземпляра в объекте ответа с именем «errors» или «success», но не найдет ее и поля nome и sobrenome в вашем Объект PostCadastro будет нулевым.

Ответ принят как подходящий

Отзывы о модернизации понимают аннотацию @SerializedName

public class PostCadastroResponse {
    @SerializedName("succes")
    @Nullable
    PostCadastro successResponse;
    @SerializedName("errors")
    @Nullable
    PostCadastro errorResponse;
}

Если ошибка, то ошибки будут не null, а в противном случае - успех.

Но более чистая архитектура может быть, когда ваш сервер вернет правильный код и правильное сообщение об ошибке в случае ошибки. Вы можете использовать стандартный Retrofit isSuccessful в классе Response

Возможно, атрибут alternate применим и к @SerializedName.

pirho 23.10.2018 20:26

Если у вас есть код состояния успеха для двух ответов, вы можете создать:

@SerializedName(value = "success", alternate = {"errors"})
@Expose
private PostCadastro postCadastro;

public PostCadastro getPostCadastro() {
    return postCadastro;
}

public void setPostCadastro(PostCadastro postCadastro) {
    this.postCadastro = postCadastro;
}

public static class PostCadastro {
    @SerializedName("nome")
    @Expose
    private List<String> nome;
    @SerializedName("sobrenome")
    @Expose
    private List<String> sobrenome;

    public List<String> getNome() {
        return nome;
    }

    public void setNome(List<String> nome) {
        this.nome = nome;
    }

    public List<String> getSobrenome() {
        return sobrenome;
    }

    public void setSobrenome(List<String> sobrenome) {
        this.sobrenome = sobrenome;
    }
}

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