【问题标题】:RETROFIT error Expected BEGIN_ARRAY but was BEGIN_OBJECT changing to object does work for meRETROFIT 错误预期 BEGIN_ARRAY 但 BEGIN_OBJECT 更改为对象对我有用
【发布时间】:2020-04-06 16:05:35
【问题描述】:

早安,

我知道有人问过这个问题,并且我发现的其他两个主题确实有所帮助。 我从客户那里得到了我无法控制的回复,所以我需要使用它的格式。

Json 包含来自多个用户的用户信息列表。 这就是我使用 List 而不是 POJO 的原因。 问题如下。 POJO 确实返回没有任何错误,但也没有任何值,并且只有一个值而不是多个值

所以我收集到的是 JSON 的格式不被视为一个列表,而是一个对象。

使用 POSTMAN 作为基准工具来验证 GET 调用是否工作列表中返回的值

我仍然是这方面的菜鸟,因此我们将不胜感激。

邮递员的 JASON 响应如下所示(这就是我意识到检索它的方式可能被视为对象而不是列表的地方。

{
  "items": [
   {
    "userpassword": "TEST123",
    "userstatus": "A",
    "useremail": "Someperson@domain.com",
    "firstname": "Some",
    "lastname": "Person"
},
{
    "userpassword": "Pass123@",
    "userstatus": "C",
    "useremail": "personannom@domain.org",
    "firstname": "Annom",
    "lastname": "Person`"
},
{
    "userpassword": "PietIE2#3",
    "userstatus": "A",
    "useremail": "Piet@pieinthesky.co.uk",
    "firstname": "Piet",
    "lastname": "Pompies"
},

],....
}

所以看来我需要再钻一层才能得到这些值。

还有一些例子

我的界面类:

import retrofit2.Call;
import retrofit2.http.GET;


public interface JasonPlaceHolder {



    @GET("allusers")
    Call<UserInfo> getUserInfo();"
    //Call<List<UserInfo>> getUserInfo();  WAS
}

我的类来存储信息

public class UserInfo {

    private String userpassword;

    private String userstatus;

    private String useremail;

    private String firstname;

    private String lastname;


    public String getUserpassword() {
    return userpassword;
    }

    public String getUserstatus() {
    return userstatus;
    }

    public String getUseremail() {
    return useremail;
    }

    public String getFirstname() {
    return firstname;
    }

    public String getLastname() {
    return lastname;
    }
}

然后我在 mainactivity 类中调用 (因为它不再是一个列表,我不能再循环遍历记录了

Retrofit retrofit = new Retrofit.Builder().
  baseUrl("http://10..../com/").
  addConverterFactory(GsonConverterFactory.create()).
  build();

JasonPlaceHolder jasonPlaceHolderApi = retrofit.create(JasonPlaceHolder.class);

Call<UserInfo> call = jasonPlaceHolderApi.getUserInfo();
  call.enqueue(new Callback<UserInfo>() {
   @Override
    public void onResponse(Call<UserInfo> call, Response<UserInfo> response) {

     if(!response.isSuccessful()){
      textVierResults.setText("code: " + response.code());
     return;
  }
  UserInfo userInfos = response.body();

  //for(UserInfo ui:userInfos){
  String content = "";
  content += "Useremail: "    + userInfos.getUseremail()    + "\n";
  content += "Userpassword: " + userInfos.getUserpassword() + "\n";
  content += "Firstname: "    + userInfos.getFirstname()    + "\n";
  content += "Lastname: "     + userInfos.getLastname()     + "\n";
  content += "Userstatus: "   + userInfos.getUserstatus()   + "\n";

  textVierResults.append(content);

  // }


}



     @Override
      public void onFailure(Call<UserInfo> call, Throwable t) {
      Toast.makeText(MainActivity.this, "An error occurred", Toast.LENGTH_SHORT).show();
      textVierResults.setText(t.getMessage());
      }
      });

任何人都可以提出解决方案。

【问题讨论】:

标签: android retrofit2


【解决方案1】:

所以看来我需要再钻一层才能得到这些值。

你可能是对的,你现在可能需要这样的东西:

class SomeClass {

   ArrayList<UserInfo> info;
}

现在您可以对此做出回应。

【讨论】:

    【解决方案2】:

    创建新的模型类 Items pass 将其替换为 UserInfo 传递 JasonPlaceHolder 和改造类

    public class Items{
    List<UserInfo> items;
    
       public list<UserInfo> getitems() {
        return items;
        }
    
    }
    
    
    
    
    
    call.enqueue(new Callback<Items>() {
       @Override
        public void onResponse(Call<Items> call, Response<Items> response) {
    
         if(!response.isSuccessful()){
          textVierResults.setText("code: " + response.getitems());
         return;
      }
    

    【讨论】:

    • 是否还需要执行两条命令“JasonPlaceHolder jasonPlaceHolderApi = retrofit.create(JasonPlaceHolder.class); Call> call = jasonPlaceHolderApi.getUserInfo();”启动“call.enqeue”函数
    • @GET("allusers") Call getUserInfo();" //Call getUserInfo(); WAS // 用旧的替换它
    【解决方案3】:

    如果要手动解析json数据,得到json树中的list节点,

    添加一个 JSONResponse 类,它将代表返回的原始 JSON,您可以使用 getItems 方法获取 userInfos 数组,该方法将返回 Json 对象中“items”键的值(在这种情况下,将返回一个数组UserInfo 对象)

    public class JSONResponse {
    private UserInfo[] items;
    
    public UserInfo[] getItems() {
        return items;
    }
    

    }

    让 Get 方法返回一个 JSONResponse 对象,如下所示

    @GET("allusers")
    Call<JSONResponse> getUserInfo();"
    

    最后,在 onResponse 中,从 JSONResponse 对象中获取 UserInfo 列表,如下所示

    JSONResponse jsonResponse = response.body();
    userInfos= new ArrayList<>(Arrays.asList(jsonResponse.getItems()));
     String content = "";
    
    for(UserInfo ui:userInfos){
    content += "Useremail: "    + ui.getUseremail()    + "\n";
    content += "Userpassword: " + ui.getUserpassword() + "\n";
    content += "Firstname: "    + ui.getFirstname()    + "\n";
    content += "Lastname: "     + ui.getLastname()     + "\n";
    content += "Userstatus: "   + ui.getUserstatus()   + "\n";
    
    
    }
    textVierResults.append(content);
    

    【讨论】:

    • 在“userInfos= new ArrayList(Arrays.asList(jsonResponse.getItems()));”行中的“userInfos”的类型是什么
    • UserInfo 对象的ArrayList,例如:ArrayList userInfos;
    • @RPN 检查我更新的答案。更新后的答案应该为 textvierResults 中的所有用户设置信息
    【解决方案4】:

    您的响应以 { 开头的第一件事,这意味着它是一个对象,并且该对象包含列表,其名称是 items 。将有一个包含该列表的根主类。

    所以创建 UserInfoRoot 类

      class UserInfoRoot {
    @SerializedName("items")
    @Expose
    private List<UserInfo > userInfo = null;
    
    public List<UserInfo > getUserInfo () {
        return userInfo ;
    }
    
    public void setUserInfo(List<UserInfo > userInfo ) {
       this.userInfo = userInfo ;
     }  
     }   
    

    现在用 UserInfoRoot 替换 UserInfo Call&lt;UserInfoRoot&gt; getUserInfo();

    【讨论】:

    • 是否有的具体声明
    • 不,您可以用您的班级替换,但只需使用 @SerializedName("items") 。将&lt;Item&gt; 替换为&lt;UserInfo&gt;
    【解决方案5】:

    尝试如下,

    public class UserInfo {
    
        private String userpassword;
        private String userstatus;
        private String useremail;
        private String firstname;
        private String lastname;
    
    
        public String getUserpassword() {
            return userpassword;
        }
    
        public String getUserstatus() {
            return userstatus;
        }
    
        public String getUseremail() {
            return useremail;
        }
    
        public String getFirstname() {
            return firstname;
        }
    
        public String getLastname() {
            return lastname;
        }
    }
    

    并创建一个包含名称“items”属性的响应模型,

    class responseUserInfor{
        private List<UserInfo> items;
    
        public List<UserInfo> getItems() {
            return items;
        }
    
        public void setItems(List<UserInfo> items) {
            this.items = items;
        }
    }
    

    并如下更改占位符类。

    import retrofit2.Call;
    import retrofit2.http.GET;
    
    public interface JasonPlaceHolder {
        @GET("allusers")
        Call<responseUserInfor> getUserInfo();"
        //Call<List<UserInfo>> getUserInfo();  WAS
    }
    

    【讨论】:

      猜你喜欢
      • 2019-06-14
      • 1970-01-01
      • 2016-09-26
      • 2017-05-16
      • 1970-01-01
      • 2020-07-26
      • 2017-02-14
      • 2015-07-24
      • 2014-08-01
      相关资源
      最近更新 更多