Я использую Дооснащение с 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;
}
Как я могу справиться с этими двумя ответами?
Я предполагаю, что 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
Если у вас есть код состояния успеха для двух ответов, вы можете создать:
@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;
}
}
Возможно, атрибут
alternate
применим и к@SerializedName
.