![](/img/trans.png)
[英]How to get nested JSON object and array from retrofit response on Android?
[英]How to get JSON ARRAY and JSON object response from retrofit response?
我曾使用改造進行文件上傳。 工作正常。 但是如何處理改造成功的響應。 以及如何為下面的Json數組和Json對象創建序列化模型類。
{
"result": [{
"fileId": 869,
"status": 1,
"pcData": {
"id": 652,
"filename": "IMG_20161122_175344.jpg",
"filepath": "uploads\/peoplecaddie\/files\/1743_1481109145_IMG_20161122_175344.jpg"
}
}]
}
這是我的通話方法
Call<ServerResponse> call = service.upload("817b6ce98fd759e7f148b948246df6c1", map, idReq, fileCountReq, fileTypeReq, platformReq, externalIDReq);
call.enqueue(new Callback<ServerResponse>() {
@Override
public void onResponse(Call<ServerResponse> call, Response<ServerResponse> response) {
ServerResponse serverResponse = response.body();
Log.e("serverResponse", "serverResponse" + serverResponse.toString());
if (serverResponse != null) {
}
}
@Override
public void onFailure(Call<ServerResponse> call, Throwable t) {
}
});
我懷疑如何使用JSON對象中的JSON數組字段,JSON對象字段和字符串值來實現ServerResponse模型類。
public class ServerResponse {
//How to handle my response with in this model class.
}
請幫我解決這個問題。 提前致謝。
如下創建類,並在call
將ServerResponse
用作模型類,
ServerResponse.class
public class ServerResponse {
@SerializedName("result")
private ArrayList<Result> mResult;
public ArrayList<Result> getResult() {
return mResult;
}
public void setResult(ArrayList<Result> result) {
mResult = result;
}
}
結果類
public class Result {
@SerializedName("fileId")
private int mFileId;
@SerializedName("status")
private String mstatus;
@SerializedName("pcData")
private PcData mPcData;
public int getFileId() {
return mFileId;
}
public void setFileId(int fileId) {
mFileId = fileId;
}
public String getMstatus() {
return mstatus;
}
public void setMstatus(String mstatus) {
this.mstatus = mstatus;
}
public PcData getPcData() {
return mPcData;
}
public void setPcData(PcData pcData) {
mPcData = pcData;
}
}
PcData.class
private class PcData {
@SerializedName("id")
private int mId;
@SerializedName("filename")
private String mFileName;
@SerializedName("filepath")
private String mFilePath;
public int getId() {
return mId;
}
public void setId(int id) {
mId = id;
}
public String getFileName() {
return mFileName;
}
public void setFileName(String fileName) {
mFileName = fileName;
}
public String getFilePath() {
return mFilePath;
}
public void setFilePath(String filePath) {
mFilePath = filePath;
}
}
您的呼叫應如下所示:
Call<ServerResponse> call = service.upload("817b6ce98fd759e7f148b948246df6c1", map, idReq, fileCountReq, fileTypeReq, platformReq, externalIDReq);
call.enqueue(new Callback<ServerResponse>() {
@Override
public void onResponse(Call<ServerResponse> call, Response<ServerResponse> response) {
ServerResponse serverResponse = response.body();
if (serverResponse != null) {
//below is how you can get the list of result
List<Result> resultList = response.getResult();
}
}
@Override
public void onFailure(Call<ServerResponse> call, Throwable t) {
}
});
您可以使用以下代碼聲明您的服務
Call<ServerResponse<ArrayList<YourModel>>>
和
public class ServerResponse<T> {
private T result;
public T getResult() {
return data;
}
public void setResult(T data) {
this.data = data;
}
}
那么您將在onResponse
方法中收到ServerResponse
並通過調用SErverResponse的getResult方法獲得lsit。
您可以將RxJava與Retrofit一起使用
首先為您的JSON響應創建Pojo,您可以使用http://www.jsonschema2pojo.org/進行此操作。
然后創建一個Singleton類進行改造
public class RetroSingleton {
private static RetroSingleton ourInstance = new RetroSingleton();
public static RetroSingleton getInstance() {
return ourInstance;
}
private RetroSingleton() {
}
public RestApi getRestApi() {
HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
logging.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
httpClient.addInterceptor(logging);
OkHttpClient client = httpClient.build();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(ConstUrl.BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.client(client)
.build();
return retrofit.create(RestApi.class);
}
}
然后創建一個接口,您可以在其中定義用於進行網絡調用的所有方法
public interface RestApi {
/*
*@POST or @GET type of call
*/
@POST("url")// either full url or path of url
Observable<YourResponsePojo> methodName(@Query("nameOfField") String field);
@GET("url")
Observable<YourResponsePojo> methodName();
}
最后,使用通話您可以使用
RetroSingleton.getInstance().getRestApi().methodName()
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<YourResponsePojo>() {
@Override
public void onCompleted() {
hideProgressDialog();
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(YourResponsePojo yourResponsePojo) {
// yourResponsePojo contains all of your response body
}
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.