Newtt
Newtt

Reputation: 6190

Read JSON data from Volley NetworkResponse

In Android, I am making an HTTP file upload request to a server as follows

MultipartRequest multipartRequest = new MultipartRequest(uploadUrl, null, mimeType, multipartBody, new Response.Listener<NetworkResponse>() {
        @Override
        public void onResponse(NetworkResponse response) {
            // Need to read Json response here
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            Log.d(GlobalClass.TAG, "File not uploaded");
        }
    });
    GlobalClass.getInstance().addToRequestQueue(multipartRequest);
}

The response is of the following structure:

{
    'response': 'some_data_to_be_used'
}

And this is my MultipartRequest class:

package com.xxxxxx.xxxxxx;


import android.util.Log;

import com.android.volley.AuthFailureError;
import com.android.volley.NetworkResponse;
import com.android.volley.ParseError;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.HttpHeaderParser;


import java.util.Map;

class MultipartRequest extends Request<NetworkResponse> {
    private final Response.Listener<NetworkResponse> mListener;
    private final Response.ErrorListener mErrorListener;
    private final Map<String, String> mHeaders;
    private final String mMimeType;
    private final byte[] mMultipartBody;

    public MultipartRequest(String url, Map<String, String> headers, String mimeType, byte[] multipartBody, Response.Listener<NetworkResponse> listener, Response.ErrorListener errorListener) {
        super(Method.POST, url, errorListener);
        this.mListener = listener;
        this.mErrorListener = errorListener;
        this.mHeaders = headers;
        this.mMimeType = mimeType;
        this.mMultipartBody = multipartBody;
    }

    @Override
    public Map<String, String> getHeaders() throws AuthFailureError {
        return (mHeaders != null) ? mHeaders : super.getHeaders();
    }

    @Override
    public String getBodyContentType() {
        return mMimeType;
    }

    @Override
    public byte[] getBody() throws AuthFailureError {
        return mMultipartBody;
    }

    @Override
    protected Response<NetworkResponse> parseNetworkResponse(NetworkResponse response) {
        try {
            return Response.success(
                    response,
                    HttpHeaderParser.parseCacheHeaders(response));
        } catch (Exception e) {
            return Response.error(new ParseError(e));
        }
    }

    @Override
    protected void deliverResponse(NetworkResponse response) {
        Log.d(GlobalClass.TAG, response.toString());
        mListener.onResponse(response);
    }

    @Override
    public void deliverError(VolleyError error) {
        mErrorListener.onErrorResponse(error);
    }
}

In my parseNetworkResponse method, I've tried the following:

protected Response<NetworkResponse> parseNetworkResponse(NetworkResponse response) {
    try {
        Log.d(GlobalClass.TAG, response.toString());
        String json = new String(response.data, HttpHeaderParser.parseCacheHeaders(response));
        return Response.success(
                response,
                HttpHeaderParser.parseCacheHeaders(response));
    } catch (Exception e) {
        return Response.error(new ParseError(e));
    }
}

Which I got from here. But this gives me the error Cannot resolve constructor String(byte[],com.android.volley.Cache.Entry).

How do I read the JSON response object and use the value of the response key as a string?

Upvotes: 1

Views: 7172

Answers (2)

deevee
deevee

Reputation: 1855

For anybody fighting with Volley in Kotlin nowadays - here is method to read data returned from Volley NetworkResponse:

override fun parseNetworkResponse(response: NetworkResponse?): Response<String?>? {
    val resp = response?.let { String(it.data) }
    Log.d("RESPONSE data", resp.toString())
    return Response.success(resp, HttpHeaderParser.parseCacheHeaders(response))
}

Upvotes: 0

Satyen Udeshi
Satyen Udeshi

Reputation: 3243

Update

As mentioned in the link you provided, you should change this line :

String json = new String(response.data, HttpHeaderParser.parseCacheHeaders(response));

to

String json = new String(response.data, HttpHeaderParser.parseCharset(response.headers));

This is because String class doesn't have any contructor that matches the one you used in your code,

Upvotes: 10

Related Questions