Android Volley,JsonObjectRequest但接收JsonArray

时间:2016-02-02 06:30:27

标签: android request android-volley jsonobjectrequest

所以我使用JsonObjectRequestJsonObject发送一个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) { } }); 作为回复?

public ActionResult AnnounceRead()
{
    using (var db = new HarmonyMainServerDbContext())
    {
        var announceList = from r in db.Announcer
                           select new { r.AnnounceTitle, r.AnnounceLink, };
        return View("Index", announceList);
    }
}

3 个答案:

答案 0 :(得分:6)

i。您附上邮寄申请的数据很好。如果你想发送一个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,它将从服务器处理响应为字符串。这也将适用于您的情况。

答案 1 :(得分:6)

我最近遇到了这种情况,并意识到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));
            }
    }
}

答案 2 :(得分:0)

我的正好相反,一个 JsonArrayRequest 返回一个 JSONObject 响应。

因此,我在 Kotlin 中的自定义请求如下:

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)

? :)