【问题标题】:Retrofit 2 return List from Json is empty改造 2 从 Json 返回列表为空
【发布时间】:2018-03-14 20:24:40
【问题描述】:

我已经与 Retrofit 2.3 战斗了大约 2 周了。列表对我来说总是空的。它只是调用并获取 JSON 信息,但不会处理列表。

Json 看起来像这样:

{
"users": [
    {
        "id": 2,
        "name": "Users Name",
        "username": "myusername",
        "facebook_id": null,
        "level": "1",
        "birthdate": "1999-09-09T00:00:00+00:00",
        "email": "user@gmail.com",
        "activated": "",
        "created": "2017-12-07T04:18:30+00:00",
        "answers": [
            {
                "id": 31,
                "question_id": 2,
                "user_id": 2,
                "answer": "School",
                "questions": [
                    {
                        "id": 2,
                        "question": "Where did you meet your best friend?"
                    }
                ]
            },
            {
                "id": 32,
                "question_id": 3,
                "user_id": 2,
                "answer": "Dog",
                "questions": [
                    {
                        "id": 3,
                        "question": "What was your first pet's name?"
                    }
                ]
            }
        ]
    }
],
"message": "Success"
}

改造接口类:

public interface RestInterface {

String url = "http://myurl.com";

/**
 * Login
 *
 * @param username  Username
 * @param password  Password
 *
 */

@FormUrlEncoded
@Headers("User-Agent:My-Application")
@POST("login")
Call<userlogin> Login(@Field("username") String username,
                      @Field("password") String password);
}

用户登录类:

public class userlogin {

@SerializedName("users")
@Expose
private List<users> users;
@SerializedName("message")
@Expose
private Object message;

public List<users> getUsers() {
    return users;
}

public void setUsers(List<users> users) {
    this.users = users;
}

public Object getMessage() {
    return message;
}

public void setMessage(Object message) {
    this.message = message;
}

}

用户类:

public class users {

    @SerializedName("id")
    @Expose
    private Integer id;
    @SerializedName("name")
    @Expose
    private String name;
    @SerializedName("username")
    @Expose
    private String username;
    @SerializedName("facebook_id")
    @Expose
    private String facebookId;
    @SerializedName("level")
    @Expose
    private String level;
    @SerializedName("birthdate")
    @Expose
    private String birthdate;
    @SerializedName("email")
    @Expose
    private String email;
    @SerializedName("activated")
    @Expose
    private String activated;
    @SerializedName("created")
    @Expose
    private String created;


    @SerializedName("answers")
    @Expose
    private List<Answer> answers = null;

    public users(){

    }

    public Integer getId() {
            return id;
    }

    public void setId(Integer id) {
            this.id = id;
    }

    public String getName() {
            return name;
    }

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

    public String getUsername() {
            return username;
    }

    public void setUsername(String username) {
            this.username = username;
    }

    public String getFacebookId() {
            return facebookId;
    }

    public void setFacebookId(String facebookId) {
            this.facebookId = facebookId;
    }

    public String getLevel() {
            return level;
    }

    public void setLevel(String level) {
            this.level = level;
    }

    public String getBirthdate() {
            return birthdate;
    }

    public void setBirthdate(String birthdate) {
            this.birthdate = birthdate;
    }

    public String getEmail() {
            return email;
    }

    public void setEmail(String email) {
            this.email = email;
    }

    public String getActivated() {
            return activated;
    }

    public void setActivated(String activated) {
            this.activated = activated;
    }

    public String getCreated() {
            return created;
    }

    public void setCreated(String created) {
            this.created = created;
    }

    public List<Answer> getAnswers() {
            return answers;
    }

    public void setAnswers(List<Answer> answers) {
            this.answers = answers;
    }

}

基本上,当它被称为我的“消息”部分返回“成功”时,我的 PHP 端基本上只是声明没有错误。如果有,则会返回错误以供显示。

当尝试获取用户信息时,它总是返回一个空列表。

我的回答总是一样的: 03-14 20:06:26.698 30995-30995/com.josh.testapp D/Response: {"message":"Success","users":[]}

03-14 20:06:26.699 30995-30995/com.josh.testapp I/System.out: 用户:: []

03-14 20:06:26.699 30995-30995/com.josh.testapp D/消息:成功

我不确定我错过了什么。用户应该以包含用户信息的列表的形式返回,在这种情况下只是用户登录的信息。但在其他部分,这也会显示子用户信息,这就是为什么它首先是列表形式地点。

请帮助或指导我正确的方向。

login.java(调用的地方)

        Gson gson = new GsonBuilder()
                .setLenient()
                .create();

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(RestInterface.url)
                .addConverterFactory(GsonConverterFactory.create(gson))
                .build();


        RestInterface restInterface = retrofit.create(RestInterface.class);

        Call<userlogin> call = restInterface.Login(
                username.getText().toString(),                            // username
                pass.getText().toString()                                 // password
        );

        call.enqueue(new Callback<userlogin>() {
            @Override
            public void onResponse(Call<userlogin> call, retrofit2.Response<userlogin> response) {

                if (response.isSuccessful()) {
                    userlogin ul = response.body();

                    try{
                        String res = new Gson().toJson(response.body());
                        Log.d("Response", res);
                        System.out.println("Users:: " + ul.getUsers().toString());
                        Log.d("Message", ul.getMessage().toString());

                        List<users> userList = ul.getUsers();

                        for(int i = 0; i < userList.size(); i++){
                            Log.d("Users", userList.get(i).getUsername());
                        }

                    } catch (Exception e){
                        Log.d("exception", e.getMessage());
                    }
                } else {
                    Log.d("unSuccessful", response.message());
                }
            }

            @Override
            public void onFailure(Call<userlogin> call, Throwable t) {
                Log.d("onFailure", t.getMessage());
            }
        });

【问题讨论】:

  • 您的日志显示应用程序没有收到用户列表。您应该检查服务器 API
  • 这就是为什么我依赖 json 的“消息”部分来取得成功。我的 php 代码只有在能够登录并获取信息时才显示成功。我已经使用 Postman 进行了测试,并得到了预期的结果。

标签: java android json gson retrofit2


【解决方案1】:

在 AbdulAli 指出它似乎没有收到用户列表后,我决定查看我的代码并在服务器 API 上运行更多测试。我发现会话存在问题。他们没有接听,因此返回了一个“成功”但为空的用户列表。在实现了一些 CookieJar 函数后,我能够为会话传递我的 cookie,并且用户列表不再为空。

虽然我觉得自己错过了这么明显的事情是个白痴,但我非常感谢你指出 AbdulAli。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-11
    • 1970-01-01
    • 1970-01-01
    • 2016-05-27
    • 1970-01-01
    • 1970-01-01
    • 2016-12-26
    • 2020-05-13
    相关资源
    最近更新 更多