【问题标题】:Retrofit JsonArray recyclerview Exception改造 JsonArray recyclerview 异常
【发布时间】:2018-06-11 00:12:31
【问题描述】:

我正在尝试从 http://jsonplaceholder.typicode.com/users 获取数据并将其显示在 recyclerview 中。我不需要 api 中的所有列

公共接口 APIService {

@GET("/users")
    Call<JSONResponse>getJSON();}

公共类 JSONResponse {

private UserInfo[] Info;

public  UserInfo[] getInfo(){
    return Info;
}}

。 公共类用户信息 {

@SerializedName("id")
private String id;
@SerializedName("name")
private String name;
@SerializedName("city")
private String city;
@SerializedName("company")
private String company;
@SerializedName("email")
private String email;
@SerializedName("phone")
private String phone;
@SerializedName("lat")
private double lat;
@SerializedName("lng")
private double lng;
@SerializedName("website")
private String website;

//getter methods }

在主要活动中

private void loadJSON() {
    Call<JSONResponse>call = apiService.getJSON();
    call.enqueue(new Callback<JSONResponse>() {
        @Override   
        public void onResponse(Call<JSONResponse> call, Response<JSONResponse> response) {


            JSONResponse jsonResponse = response.body();                  
            data = new ArrayList<>(Arrays.asList(jsonResponse.getInfo()));
            adapter = new DataAdapter(data);
            recyclerView.setAdapter(adapter);
        }

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

我收到 java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path $.

我尝试更改为Call&lt;List&lt;UserInfo&gt;&gt; getJSON();,但我得到了 java.lang.IllegalStateException: Expected a string but was BEGIN_OBJECT at line 19 column 17 path $[0].company

【问题讨论】:

标签: java android json retrofit


【解决方案1】:

使用这个模型类

public class UserInfo {

@SerializedName("id")
@Expose
private Integer id;
@SerializedName("name")
@Expose
private String name;
@SerializedName("username")
@Expose
private String username;
@SerializedName("email")
@Expose
private String email;
@SerializedName("address")
@Expose
private Address address;
@SerializedName("phone")
@Expose
private String phone;
@SerializedName("website")
@Expose
private String website;
@SerializedName("company")
@Expose
private Company company;

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 getEmail() {
return email;
}

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

public Address getAddress() {
return address;
}

public void setAddress(Address address) {
this.address = address;
}

public String getPhone() {
return phone;
}

public void setPhone(String phone) {
this.phone = phone;
}

public String getWebsite() {
return website;
}

public void setWebsite(String website) {
this.website = website;
}

public Company getCompany() {
return company;
}

public void setCompany(Company company) {
this.company = company;
}

}

然后换成这样的界面

public interface APIService {

@GET("/users")
Call<List<UserInfo>> getJSON();
}

而你的网络调用功能应该是这样的

private void loadJSON() {
Call<List<UserInfo>> call = apiService.getJSON();
call.enqueue(new Callback<List<UserInfo>>() {
    @Override   
    public void onResponse(Call<List<UserInfo>> call, Response<List<UserInfo>> response) {


        List<UserInfo> user = response.body();                  
        data = new ArrayList<>(user);
        adapter = new DataAdapter(data);
        recyclerView.setAdapter(adapter);
    }

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

【讨论】:

  • 我在这一行有一个错误:UserInfo user = response.body();不兼容的类型。必需:sd.task.UserInfo 找到:java.util.List
  • 更改UserInfo user = response.body();到List&lt;UserInfo&gt; user = response.body()
  • 现在我遇到了一个错误:data = new ArrayList(Arrays.asList(user));未经检查的赋值:“java.util.ArrayList”到“java.util.ArrayList”未经检查的调用“ArrayList(Collection extends E>)”作为原始类型“java.util”的成员。数组列表'
  • @user3178058 将data = new ArrayList&lt;&gt;(Arrays.asList(user)); 更改为data = new ArrayList&lt;&gt;(user);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-18
  • 1970-01-01
  • 2018-08-06
  • 2016-05-02
  • 1970-01-01
相关资源
最近更新 更多