【发布时间】: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