2015-06-16 7 views
9

Muszę opublikować JSONObject (używając Volley) do usługi internetowej, która zwraca odpowiedź w formacie JSONArray.Prześlij dane obiektu Json, aby uzyskać odpowiedź tablicy Json za pomocą volley w Androidzie

Oto, co próbowałem do tej pory.

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

Ale jestem coraz JSONException mówiąc, że JSONArray nie mogą być konwertowane do JSONObject. Czy istnieje sposób uzyskania odpowiedzi w formacie JSONArray? Jakie jest najlepsze rozwiązanie mojego problemu? Jak mogę wysłać JSONObject, jeśli używam StringRequest zamiast JsonObjectRequest? Proszę mnie poprowadzić:

+0

można użyć JsonArrayRequest –

+0

JsonArrayRequest wymaga parametr wejściowy jako JSONArray, który nie nadaje się do tego przypadku – anhtuannd

+0

można oddać człowiek – Shikhar

Odpowiedz

11

Poniżej klasy pomocnika ustaliła mój 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)); 
    } 
} 

} 

Jak tego używać?

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

dzięki sir, jak korzystać z tej klasy? –

+0

@mahdipishguy: Zaktualizowałem mój ans – Santhosh

+0

użyłem twojego kodu i podczas dodawania do requestQueue jsonObjReq pokazuje null, ale requestjsonObject zawiera taki typ wartości ** "{" id ":" 1 "}" ** tak jest parą Key value? ? A jeśli jest to para kluczy kluczowych niż po stronie serwera, jak mogę ją pobrać – techDigi

0

Wygląda na to, że otrzymujesz odpowiedź tablicy json.

Czy możesz zmienić swój kod w ten sposób.

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

próbować ten jeden

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); 
Powiązane problemy