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

2
  • you can use JsonArrayRequest Commented Jun 16, 2015 at 4:53
  • 1
    JsonArrayRequest requires input parameter as JSONArray, which is not suitable for this case Commented Sep 17, 2015 at 6:23

3 Answers 3

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);
Sign up to request clarification or add additional context in comments.

3 Comments

@mahdipishguy : Updated my ans
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 it
how does it work for Get call,i want get reponse in type of List<myclass>
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
        }
  };

Comments

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

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.