当前位置: 首页 > 知识库问答 >
问题:

处理不同的改装响应

宋飞掣
2023-03-14

我知道这个问题已经被问了很多,但我所看到的答案都没有帮助我澄清这个问题。我需要更多的指导方针,而不是一个具体的答案。

{
    "ok": [
        {
            "id": 1,
            "username": "test",
            "pass": "123",
            "reg_date": "2020-05-27 00:00:00"
        }
    ]
}
{
    "error": [
        {
            "message": "No such user"
        }
    ]
}

错误,没有这样的用户

到目前为止,我所尝试的是为列表中收到的每个对象创建一个类:

public class EntityUser {
    @SerializedName("id")
    private int id;
    @SerializedName("username")
    private String username;
    @SerializedName("pass")
    private String password;
    @SerializedName("reg_date")
    private String registerDate;

    //Getters and constructor...
}
public class EntityError {
    @SerializedName("message")
    private String message;

    //Getters and constructor...
}

和Api,我认为这就是问题所在:

public interface JsonApi {
    @GET("SelectUser.php")
    Call<Map<String, List>> getGenericResponse();
}
Gson gson = new GsonBuilder().setLenient().create();
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://192.168.0.35/app_android/webservices/")
                .addConverterFactory(GsonConverterFactory.create(gson))
                .build();

        JsonApi jsonApi = retrofit.create(JsonApi.class);
        Call<Map<String, List>> call = jsonApi.getGenericResponse();

        call.enqueue(new Callback<Map<String, List>>() {
            @Override
            public void onResponse(Call<Map<String, List>> call, Response<Map<String, List>> response) {
                if(response.isSuccessful()){
                    if (response.body().containsKey("ok")){
                         //Here i need to create instance of EntityUsr so I can bind the values to his vars
                    }if(response.body().containsKey("error")){
                        //Shows an error message according to the message value
                    }
                }
            }

            @Override
            public void onFailure(Call<Map<String, List>> call, Throwable t) {
                prueba.setText("Error: " + t.getMessage());
            }
        });

提前感谢!!

共有1个答案

拓拔阎宝
2023-03-14

您可以使用简单的方法而不是将其解析为映射

  1. 声明对象userresponse
public class UserResponse {
    @SerializedName("ok")
    private ArrayList<EntityUser> users;
    @SerializedName("error")
    private ArrayList<EntityError> errors;
}
public interface JsonApi {
    @GET("SelectUser.php")
    Call<UserResponse> getGenericResponse();
}
if (response.body().getUsers() != null){
   // return list users
}if(response.body().getErrors != null){
   // return list errors
}
 类似资料:
  • 这是我在改装2.0中获得回应的逻辑 现在他们对API进行了更改,数据如下: 如何处理ONResponse中的对象并解析数组中的钱包信息?

  • 我正在使用Retrofit和Gson从REST服务获取数据。它运行完美,但仅当API不返回错误时。通常,API返回对象列表(作为json),但当发生错误时,API返回单个错误对象。我正在尝试获取

  • 以下是GSON的例外: 改型实例是使用GsonConverterFactory创建的

  • 我使用的API根据成功/失败有不同的json响应。它们不是HTTP错误,而是json主体中的代码。 我添加了一个,但感觉我只是把事情放在一起,忽略了问题。这是一种可接受的或“pythonic”的方式来处理类似的不同响应吗?另外,如果存在状态,我是否正确地使用来跳过该行?

  • 我想知道如何将response.body()作为参数传递,以便进一步处理它。因为现在我只能将其传递给Toast或text View的setText,它工作得很好。但是如果我尝试将其传递给将其保存为SharedPrefs或类似的函数,它只是传递一个空对象。我不明白为什么第一个有效,但第二个无效,有什么区别? 我的JSON响应正文如下所示: 我的Pojo是这样的: 我执行调用的函数(在点击登录按钮后调

  • 我使用改造2.7.1与静态编程语言协程。 我的改装服务定义如下: 此调用返回HTTP 204无内容响应,这会导致改装时崩溃: 如何使用协程处理改造中的204响应而不崩溃?