Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android volley使用接受JSONArray参数的getParams实现自定义请求_Android_Json_Android Volley - Fatal编程技术网

Android volley使用接受JSONArray参数的getParams实现自定义请求

Android volley使用接受JSONArray参数的getParams实现自定义请求,android,json,android-volley,Android,Json,Android Volley,我正在使用Google的Volley使用以下自定义请求类发出GET和POST请求: public class GsonRequest<T> extends Request<T> { private static final int SOCKET_TIMEOUT_MS = 30000; private static final int MAX_RETRIES = 3; private final Gson gson = new Gson();

我正在使用Google的
Volley
使用以下自定义请求类发出
GET
POST
请求:

public class GsonRequest<T> extends Request<T> {

    private static final int SOCKET_TIMEOUT_MS = 30000;
    private static final int MAX_RETRIES = 3;

    private final Gson gson = new Gson();
    private final Type type;
    private final Map<String, String> params;
    private final Response.Listener<T> listener;

    /**
     * Make a GET request and return a parsed object from JSON.
     *
     * @param url    URL of the request to make
     * @param type   Relevant type object, for Gson's reflection
     * @param params Map of request params
     */
    public GsonRequest(int method, String url, Type type, Map<String, String> params,
                       Response.Listener<T> listener, Response.ErrorListener errorListener) {
        super(method, url, errorListener);
        this.type = type;
        this.params = params;
        this.listener = listener;
    }

    @Override
    public Map<String, String> getHeaders() throws AuthFailureError {
        return headers;
    }

    @Override
    protected Map<String, String> getParams() throws AuthFailureError {
        // Here is my question, can I add a param value as JSONArray? like this:
        params.put("orderValue", "35");
        params.put("price", ""price": ["13.00", "22.00"]");
        return params != null ? params : super.getParams();
    }

    @Override
    public Request<?> setRetryPolicy(RetryPolicy retryPolicy) {
        final RetryPolicy policy = new DefaultRetryPolicy(SOCKET_TIMEOUT_MS, MAX_RETRIES,
                DefaultRetryPolicy.DEFAULT_BACKOFF_MULT);
        return super.setRetryPolicy(policy);
    }

    @Override
    public String getBodyContentType() {
        return "application/json";
    }

    @Override
    public byte[] getBody() throws AuthFailureError {
        try {
            Log.i("" + gson.toJson(params).getBytes("utf-8"));
            return gson.toJson(params).getBytes("utf-8");
        } catch (UnsupportedEncodingException uee) {
            VolleyLog.wtf("Unsupported Encoding while trying to get the bytes of %s using %s", gson.toJson(params), "utf-8");
            return super.getBody();
        }
    }

    @Override
    protected void deliverResponse(T response) {
        listener.onResponse(response);
    }

    @Override
    protected Response<T> parseNetworkResponse(NetworkResponse response) {
        try {
            final String json = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
            return (Response<T>) Response.success(gson.fromJson(json, type), HttpHeaderParser.parseCacheHeaders(response));
        } catch (UnsupportedEncodingException e) {
            return Response.error(new ParseError(e));
        } catch (JsonSyntaxException e) {
            return Response.error(new ParseError(e));
        }
    }
}
我从
getBody()
方法日志中得到的实际发送内容是:

{
  "price": "[\"23.00\",\"55.00\"]",
  "orderValue": "35"
}

有关于此问题的帮助吗?

您需要将请求扩展到**JsonObjectRequest**或创建JSONArrayRequest对象

public class VolleyJSONObjectRequest extends JsonObjectRequest {

    private Context context;
    private int timeOut = 10000;
    private int maxRetries = 1;

    public VolleyJSONObjectRequest(int method, Context context, String url, JSONObject jsonObject, Listener<JSONObject> listener, ErrorListener errorListener) {
        super(method, url, jsonObject, listener, errorListener);
        super.setRetryPolicy(new DefaultRetryPolicy(timeOut, maxRetries, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
    }

    public void startRequest() {
        VolleyHandler.get(context).addToRequestQueue(this);
    }
}

您是否尝试添加了一个
JsonArray
?我正在从另一个类发送JsonArray参数,如下所示:
params.put(PRICE,new-JsonArray(mPricesList.toString())
@chirag90,它不是重复的,我使用的是自定义请求,不是JSONArrayRequest。在发布我的问题之前,我做了搜索。谢谢你有答案吗?这不起作用,API不接受单独的
JSONArray
值,如
price[0]、price[1]、…,等等。
public class VolleyJSONObjectRequest extends JsonObjectRequest {

    private Context context;
    private int timeOut = 10000;
    private int maxRetries = 1;

    public VolleyJSONObjectRequest(int method, Context context, String url, JSONObject jsonObject, Listener<JSONObject> listener, ErrorListener errorListener) {
        super(method, url, jsonObject, listener, errorListener);
        super.setRetryPolicy(new DefaultRetryPolicy(timeOut, maxRetries, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
    }

    public void startRequest() {
        VolleyHandler.get(context).addToRequestQueue(this);
    }
}
private void saveItems(){
        if  (itens != null && itens.size() > 0) {
            try {
                JSONArray itensJson = new JSONArray();

                for (SalesOrderItem item : itens) { // your loop

                    JSONObject jsonObject = new JSONObject();

                    jsonObject.put("price", this.priceOne);
                    jsonObject.put("price", this.priceTwo);

                    itensJson.put(jsonObject);
                }

                JSONObject headerJSON = new JSONObject();
                headerJSON.put("price", itensJson);

                VolleyJSONObjectRequest request = new VolleyJSONObjectRequest(Request.Method.POST, context, context.getString(R.string.URL_SALES_ORDER_ITENS_INSERT), headerJSON, onResponseItem, onErrorResponseItem);
                request.startRequest();

            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    }

  request = new VolleyStringRequest(context, context.getString(R.string.URL_FINISH_SALES_ORDER_DRAFT), onResponseFinishSalesOrderDraft, onErrorResponseFinishSalesOrderDraft);
  request.startRequest();