【问题标题】:How to parse JSONArray using Retrofit如何使用 Retrofit 解析 JSONArray
【发布时间】:2017-08-11 20:34:25
【问题描述】:

我已经使用http://www.jsonschema2pojo.org/ 生成了我的 POJO,现在我想解析我的 JSONResponse 格式:

[  
   {  
    "id":1,
    "name":"xyz",
    "rxg":5,
    "img":"xyz.jpg"
    },
 {  
    "id":2,
    "name":"abc",
    "rxg":9,
    "img":"abc.jpg"
    },
{  },
{  }

这就是我不知道如何进行的地方:

    Call<List<MyList>> call = apiInterface.doGetListResources();
    call.enqueue(new Callback<List<MyList>>() {
        @Override
        public void onResponse(Call<List<MyList>> call, 
Response<List<MyList>> response) {
                // How to proceed ahead? I'm completely stuck here

        }

这是我的模型类:

公共类 MyList 实现 Parcelable {

@SerializedName("id")
@Expose
public int id;
@SerializedName("name")
@Expose
public String name;
@SerializedName("rxg")
@Expose
public int rxg;
@SerializedName("image")
@Expose
public String img;

public final static Parcelable.Creator<MyList> CREATOR = new Creator<MyList>() {

    @SuppressWarnings({
            "unchecked"
    })
    public MyList createFromParcel(Parcel in) {
        MyList instance = new MyList();
        instance.id = ((int) in.readValue((int.class.getClassLoader())));
        instance.name = ((String) in.readValue((String.class.getClassLoader())));
        instance.rxg = ((int) in.readValue((int.class.getClassLoader())));
        instance.img = ((String) in.readValue((String.class.getClassLoader())));
        return instance;
    }

    public MyList[] newArray(int size) {
        return (new MyList[size]);
    }

};

/**
 * No args constructor for use in serialization
 */
public MyList() {
}

/**
 * @param id
 * @param rxg
 * @param name
 * @param img
 */
public MyList(int id, String name, int rxg, String img) {
    super();
    this.id = id;
    this.name = name;
    this.rxg = rxg;
    this.img = img;
}

public int getId() {
    return id;
}

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

public String getName() {
    return name;
}

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

public int getRxg() {
    return rxg;
}

public void setRxg(int rxg) {
    this.rxg = rxg;
}

public String getImg() {
    return img;
}

public void setImg(String img) {
    this.img = img;
}

public void writeToParcel(Parcel dest, int flags) {
    dest.writeValue(id);
    dest.writeValue(name);
    dest.writeValue(rxg);
    dest.writeValue(img);
}

public int describeContents() {
    return 0;
  }
}

这是我第一次尝试改造,所以请多多包涵。非常感谢您的帮助。我试图在这里研究类似的问题:https://stackoverflow.com/a/39774297/5770629 但无法采取进一步措施。

【问题讨论】:

    标签: android retrofit2 gson


    【解决方案1】:

    首先,您应该检查响应是否成功。

    如果成功,那么你的 body 就是你正在寻找的数据(前提是你已经形成了正确的 POJO 类)

    否则观察错误并采取相应措施。

    Call<List<MyList>> call = apiInterface.doGetListResources();
    
    call.enqueue(new Callback<List<MyList>>() {
        @Override
        public void onResponse(Call<List<MyList>> call,
                                              Response<List<MyList>> response) {
                if(response.isSuccessful(){
                     List< MyList > list = response.body();
                }
                else{
                   //throw response.errorbody message to user
                }
    
        }
    

    【讨论】:

    • 响应成功但无法获取数据。原因是我对如何在这里循环一无所知。使用 getter 获取数据时,我什么也得不到。
    • 所以你的意思是根据我提到的代码,如果你只记录 list.size() 你得到 0,或者你有没有尝试在成功的情况下记录 response.body.string() ?
    • 现在我在 Logcat 上得到了这个: D/OkHttp: ETag: "f6560d9c0785104d09908d052635b92c" 我试过了: if(response.isSuccessful()){ List myList = response.body() ; Log.v("my_tag", myList.toString()); Log.v("my_tag", "大小为:"+list.size()); for (MyList myList : list) { String name = myList.getName(); Log.d("my_tag", "" + " " + name.toString()); } }else{ } Log.d("my_tag", response.code() + ""); }
    • 还有,这个:D/OkHttp:
    • 如果日志 response.body.string 打印出您在问题开头提到的确切响应,那么至少改造电话是完美的。然后您需要查看您使用哪个库来解析对预期 POJO 类的响应。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-08
    • 1970-01-01
    • 2023-01-03
    • 1970-01-01
    • 2020-07-16
    • 1970-01-01
    相关资源
    最近更新 更多