2015-06-16 23 views
9

Tôi cần đăng JSONObject (sử dụng Volley) vào dịch vụ web trả lại phản hồi ở định dạng JSONArray.Đăng dữ liệu đối tượng Json để nhận phản hồi mảng Json bằng cách sử dụng cú volley trong android

Đây là những gì tôi đã thử cho đến nay.

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

Nhưng tôi nhận được JSONException nói rằng JSONArray không thể được chuyển đổi sang JSONObject. Có cách nào để nhận phản hồi ở định dạng JSONArray không? Giải pháp tốt nhất có thể cho vấn đề của tôi là gì? Làm cách nào để gửi JSONObject nếu tôi sử dụng StringRequest thay vì JsonObjectRequest? Vui lòng hướng dẫn tôi

+0

bạn có thể sử dụng JsonArrayRequest –

+0

JsonArrayRequest đòi hỏi thông số đầu vào như JSONArray, mà không phải là thích hợp cho trường hợp này – anhtuannd

+0

bạn có thể cast man – Shikhar

Trả lời

11

Dưới lớp helper đã cố định vấn đề của tôi

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

} 

Làm thế nào để sử dụng này?

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

nhờ thưa ông, làm thế nào để sử dụng lớp này? –

+0

@mahdipishguy: Cập nhật ans của tôi – Santhosh

+0

tôi đã sử dụng mã của bạn và trong khi thêm vào requestQueue jsonObjReq hiển thị null nhưng requestjsonObject chứa loại giá trị đó ** "{" id ":" 1 "}" ** thì cặp khóa giá trị là gì? ? Và nếu đó là một cặp keyValue hơn ở phía máy chủ làm thế nào tôi có thể lấy nó – techDigi

0

Có vẻ như bạn đang nhận được phản hồi mảng json.

Bạn có thể thay đổi mã của mình như thế này không.

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

thử này một

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); 
Các vấn đề liên quan