1

I have worked with file upload using retrofit. It works fine. But how do handle the retrofit success response. and How do i create serialization model class for below Json array and Json object.

{
        "result": [{
            "fileId": 869,
            "status": 1,
            "pcData": {
                "id": 652,
                "filename": "IMG_20161122_175344.jpg",
                "filepath": "uploads\/peoplecaddie\/files\/1743_1481109145_IMG_20161122_175344.jpg"
            }
        }]
    }

Here is My call method

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) {

            }
        });

I am having doubt that how to implement ServerResponse model class with JSON array field, JSON object field and string values which is inside JSON object.

public class ServerResponse {
    //How to handle my response with in this model class.

}

Please help me to solve this. Thanks in advance.

1
  • Your code looks fine. You can access the data with you serverResponse object. If you want a JsonObject for ServerResponse, you can you Gson to parse it. Are hitting the onFailure or the onSuccess callback? Commented Dec 7, 2016 at 12:11

3 Answers 3

7

Create Classes like below and use ServerResponse as the model class while call,

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;
    }
}

Result.class

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;
    }
}

And your call should be like this:

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) {

        }
    });
Sign up to request clarification or add additional context in comments.

Comments

3

You can declare your service using below code

Call<ServerResponse<ArrayList<YourModel>>>

and

public class ServerResponse<T> {

private T result;
public T getResult() {
    return data;
}

public void setResult(T data) {
    this.data = data;
}


}

then you will receive ServerResponse in onResponse Method and get lsit by calling method getResult of SErverResponse.

Comments

0

You can use RxJava with Retrofit

First create Pojo for your JSON Response, you can use http://www.jsonschema2pojo.org/ for doing this.

Then Create a Singleton class for Retrofit

    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);
    }
}

Then Create a Interface where you can define all your methods for doing network calls

    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();

}

Finally for using the call you can use

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
            }
        });

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.