Android Volley, JsonObjectRequest, но получает JsonArray
Так что я использую JsonObjectRequest
отправить JsonObject
на отдых, но его возвращение JsonArray
скорее тогда JsonObject
, Это дает мне ошибку, говоря, что он не может проанализировать результаты JsonObjectRequest
, но если я использую JsonArrayRequest
я не могу отправить JsonObject
в теле. Как мне отправить JsonObject
но получить JsonArray
в ответ?
RequestQueue queue = Volley.newRequestQueue(this);
JsonObjectRequest jsObjRequest = new JsonObjectRequest(Request.Method.POST,url,jsonBody,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
String test = "";
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
3 ответа
Я недавно столкнулся с этой ситуацией и понял, что Volley не предлагает никаких готовых решений для этого. Вы создали собственный ответ, который принимает запрос объекта json и возвращает массив. Как только вы создадите свой собственный класс, вы сможете сделать что-то вроде этого.
CustomJsonRequest jsonObjectRequest = new CustomJsonRequest(Request.Method.POST, url, credentials, new Response.Listener<JSONArray>(){...}
package com.example.macintosh.klickcard.Helpers.Network;
import com.android.volley.NetworkResponse;
import com.android.volley.ParseError;
import com.android.volley.Response;
import com.android.volley.toolbox.HttpHeaderParser;
import com.android.volley.toolbox.JsonRequest;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.UnsupportedEncodingException;
/**
* Created by yasinyaqoobi on 10/6/16.
*/
public class CustomJsonRequest<T> extends JsonRequest<JSONArray> {
private JSONObject mRequestObject;
private Response.Listener<JSONArray> mResponseListener;
public CustomJsonRequest(int method, String url, JSONObject requestObject, Response.Listener<JSONArray> responseListener, Response.ErrorListener errorListener) {
super(method, url, (requestObject == null) ? null : requestObject.toString(), responseListener, errorListener);
mRequestObject = requestObject;
mResponseListener = responseListener;
}
@Override
protected void deliverResponse(JSONArray response) {
mResponseListener.onResponse(response);
}
@Override
protected Response<JSONArray> parseNetworkResponse(NetworkResponse response) {
try {
String json = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
try {
return Response.success(new JSONArray(json),
HttpHeaderParser.parseCacheHeaders(response));
} catch (JSONException e) {
return Response.error(new ParseError(e));
}
} catch (UnsupportedEncodingException e) {
return Response.error(new ParseError(e));
}
}
}
Данные, которые вы прикрепляете с помощью почтового запроса, в порядке. Если вы хотите отправить объект json или массив json, все в порядке. Единственное, что вы должны понять, это.
Когда вы отправляете данные на сервер, вы получите ответ, в вашем случае это JsonArray. т.е. ваши отправляющие данные (массив или объект) не имеют ничего общего с создаваемым вами запросом. Вы просто прикрепляете данные с помощью звонка.
Вы должны создать JsonArrayrequest для обработки ответа сервера.
string value = jsonbody.toString();
JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(Request.Method.POST,url,value,
new Response.Listener<JsonArray>() {
@Override
public void onResponse(JsonArray response) {
String test = "";
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
Если вы не уверены, какой ответ вы получите от сервера (объект Json или массив), вы можете использовать StringRequest, который будет обрабатывать ответ от сервера в виде строки. который также будет работать в вашем случае.
У меня было наоборот: JsonArrayRequest возвращал ответ JSONObject.
Поэтому мой пользовательский запрос в Котлине был следующим:
open class CustomJsonRequest(
method: Int,
url: String?,
params: JSONArray,
responseListener: Response.Listener<JSONObject>,
listener: Response.ErrorListener?,
) :
JsonRequest<JSONObject>(method, url, params.toString(), responseListener, listener) {
override fun deliverResponse(response: JSONObject?) {
super.deliverResponse(response)
}
override fun parseNetworkResponse(response: NetworkResponse): Response<JSONObject?>? {
return try {
val jsonString = String(response.data, Charset.forName(HttpHeaderParser.parseCharset(response.headers)))
Response.success(JSONObject(jsonString), HttpHeaderParser.parseCacheHeaders(response))
} catch (e: UnsupportedEncodingException) {
Response.error(ParseError(e))
} catch (je: JSONException) {
Response.error(ParseError(je))
}
}
}
Затем используйте его следующим образом:
val request: CustomJsonRequest =
object : CustomJsonRequest(
Method.POST, url, you_JSONArray_request_body,
Response.Listener { response ->
// handle the JSONObject response
},
Response.ErrorListener { error ->
// handle the error response
}) {
// your request headers
override fun getHeaders(): Map<kotlin.String, kotlin.String>? {
return your_headers
}
// other overrides ...
}
// enqueue the request
Volley.newRequestQueue(applicationContext).add(request)
:)