Post Json object data to get Json array response using volley in android
Asked Answered
M

3

14

I need to post JSONObject (using Volley) to a web-service which is returning the response in JSONArray format.

Here is what I have tried so far.

final JSONObject requestJsonObject = new JSONObject();
requestJsonObject.put("username", userName);
requestJsonObject.put("password", password);

JsonObjectRequest jsonObjReq = new JsonObjectRequest(Method.POST, ServiceUrls.LOGIN_URL, requestJsonObject, loginResponseListener, loginErrorListener);


private Listener<JSONObject> loginResponseListener = new Listener<JSONObject>() {
    @Override
    public void onResponse(JSONObject resposne) {
         //other stuff goes here
    }
};

But I'm getting JSONException saying that JSONArray cannot be converted to JSONObject. Is there a way to get the response in JSONArray format? What is the best possible solution for my problem? How can I send JSONObject if I use StringRequest instead of JsonObjectRequest? Please guide me

Merwin answered 16/6, 2015 at 4:50 Comment(2)
you can use JsonArrayRequestPaddle
JsonArrayRequest requires input parameter as JSONArray, which is not suitable for this caseUrge
M
16

Below helper class has fixed my problem

public class CustomRequest extends JsonRequest<JSONArray> {

protected static final String PROTOCOL_CHARSET = "utf-8";
/**
 * Creates a new request.
 * @param method the HTTP method to use
 * @param url URL to fetch the JSON from
 * @param requestBody A {@link String} to post with the request. Null is allowed and
 *   indicates no parameters will be posted along with request.
 * @param listener Listener to receive the JSON response
 * @param errorListener Error listener, or null to ignore errors.
 */
public CustomRequest(int method, String url, String requestBody, Listener<JSONArray> listener, ErrorListener errorListener) {
    super(method, url, requestBody, listener, errorListener);
}

/**
 * Creates a new request.
 * @param url URL to fetch the JSON from
 * @param listener Listener to receive the JSON response
 * @param errorListener Error listener, or null to ignore errors.
 */
public CustomRequest(String url, Listener<JSONArray> listener, ErrorListener errorListener) {
    super(Method.GET, url, null, listener, errorListener);
}

/**
 * Creates a new request.
 * @param method the HTTP method to use
 * @param url URL to fetch the JSON from
 * @param listener Listener to receive the JSON response
 * @param errorListener Error listener, or null to ignore errors.
 */
public CustomRequest(int method, String url, Listener<JSONArray> listener, ErrorListener errorListener) {
    super(method, url, null, listener, errorListener);
}

/**
 * Creates a new request.
 * @param method the HTTP method to use
 * @param url URL to fetch the JSON from
 * @param jsonRequest A {@link JSONArray} to post with the request. Null is allowed and
 *   indicates no parameters will be posted along with request.
 * @param listener Listener to receive the JSON response
 * @param errorListener Error listener, or null to ignore errors.
 */
public CustomRequest(int method, String url, JSONArray jsonRequest, Listener<JSONArray> listener, ErrorListener errorListener) {
    super(method, url, (jsonRequest == null) ? null : jsonRequest.toString(), listener, errorListener);
}

/**
 * Creates a new request.
 * @param method the HTTP method to use
 * @param url URL to fetch the JSON from
 * @param jsonRequest A {@link JSONObject} to post with the request. Null is allowed and
 *   indicates no parameters will be posted along with request.
 * @param listener Listener to receive the JSON response
 * @param errorListener Error listener, or null to ignore errors.
 */
public CustomRequest(int method, String url, JSONObject jsonRequest, Listener<JSONArray> listener, ErrorListener errorListener) {
    super(method, url, (jsonRequest == null) ? null : jsonRequest.toString(), listener, errorListener);
}

/**
 * Constructor which defaults to <code>GET</code> if <code>jsonRequest</code> is
 * <code>null</code>, <code>POST</code> otherwise.
 *
 * @see #MyjsonPostRequest(int, String, JSONArray, Listener, ErrorListener)
 */
public CustomRequest(String url, JSONArray jsonRequest, Listener<JSONArray> listener, ErrorListener errorListener) {
    this(jsonRequest == null ? Method.GET : Method.POST, url, jsonRequest, listener, errorListener);
}

/**
 * Constructor which defaults to <code>GET</code> if <code>jsonRequest</code> is
 * <code>null</code>, <code>POST</code> otherwise.
 *
 * @see #MyjsonPostRequest(int, String, JSONObject, Listener, ErrorListener)
 */
public CustomRequest(String url, JSONObject jsonRequest, Listener<JSONArray> listener, ErrorListener errorListener) {
    this(jsonRequest == null ? Method.GET : Method.POST, url, jsonRequest, listener, errorListener);
}

@Override
protected Response<JSONArray> parseNetworkResponse(NetworkResponse response) {
    try {
        String jsonString = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
        return Response.success(new JSONArray(jsonString), HttpHeaderParser.parseCacheHeaders(response));
    } catch (UnsupportedEncodingException e) {
        return Response.error(new ParseError(e));
    } catch (JSONException je) {
        return Response.error(new ParseError(je));
    }
}

 }

How to use this?

    JSONObject requestJsonObject = new JSONObject();
    requestJsonObject.put("first_name", firstName);
    requestJsonObject.put("last_name", lastName);
    requestJsonObject.put("email_address", emailId);
    requestJsonObject.put("password", password);

    CustomRequest jsonObjReq = new CustomRequest(Method.POST, YOUR_URL, requestJsonObject, responseListener, errorListener);
Merwin answered 16/6, 2015 at 5:24 Comment(3)
@mahdipishguy : Updated my ansMerwin
i used your code and during add to requestQueue jsonObjReq show null but the requestjsonObject contain such type of value "{"id":"1"}" so is a Key value pair?? And if it's a keyValue pair than on the server side how can i retrieve itCentro
how does it work for Get call,i want get reponse in type of List<myclass>Clemens
S
0

Looks like you are getting the json array response.

Can you change your code like this.

  private Listener<JsonArray> loginResponseListener = new Listener<JsonArray>() {
         @Override
        public void onResponse(JsonArray resposne) {
         //other stuff goes here
        }
  };
Systematology answered 16/6, 2015 at 4:56 Comment(0)
U
-1

try this one

RequestQueue request = Volley.newRequestQueue(this);
JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(url,new Response.Listener<JSONArray>() 
        {

            @Override
            public void onResponse(JSONArray response) 
            {
                List<Contact> result = new ArrayList<Contact>();
                for (int i = 0; i < response.length(); i++) 
                {
                    try
                    {
                        result.add(convertContact(response
                                .getJSONObject(i)));
                    } 
                    catch (JSONException e)
                    {

                    }
                }
                adpt.setItemList(result);
                adpt.notifyDataSetChanged();
            }
        }, new Response.ErrorListener() 
        {

            @Override
            public void onErrorResponse(VolleyError error)
            {
                // Handle error
            }
        });

request.add(jsonArrayRequest);
Uel answered 16/6, 2015 at 5:29 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.