如何在Volley中以POST请求发送JSON数组?

13

我正在使用Volley进行JSON解析。 我想使用POST将一些数据发送到服务器端。 我正在尝试发送筛选数组,现在有人能告诉我如何将其发送到服务器吗?

以下是我的代码片段。 我也尝试了HashmapJsonobject, 但是出现了这个错误。

错误:

org.json.JSONException: Value  at Data of type java.lang.String cannot be converted to JSONObject

格式

{
    "typeName": "MANUFACTURER",
    "typeId": 22,
    "cityId": 308,
    "sortBy": "productname",
    "sortOrder": "desc",
    "filter":[
                {
                    "filterId":101,
                    "typeName":"CAT_ID",

                     "filterId":102,
                    "typeName":"CAT_ID"
                }
             ]
}

用于代码检查的pastie

https://pastebin.com/u5qD8e2j


请见此处 - UltimateDevil
6个回答

14
如果您在调用API时遇到问题,这将对您有所帮助。
RequestQueue queue = Volley.newRequestQueue(this);
JsonObjectRequest jobReq = new JsonObjectRequest(Request.Method.POST, url, jObject,
        new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject jsonObject) {

            }
        },
        new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError volleyError) {

            }
        });

queue.add(jobReq);

jObject是您要发送到服务器的JSON数据。

对于JSONArray,实现方式类似。只需使用JsonArrayRequest而不是JsonObjectRequest,并发送jArray而不是jObject。

要创建json数组,只需要稍作调整即可。

JSONArray array=new JSONArray();

for(int i=0;i<filter_items.size();i++){
    JSONObject obj=new JSONObject();
    try {
        obj.put("filterId",filter_items.get(i));
        obj.put("typeName","CAT_ID");
    } catch (JSONException e) {
        e.printStackTrace();
    }
    array.put(obj);
}

最后,按照下面的方式添加json数组

jsonParams.put("filter",array);

在您的情况下,您正在将Json数组转换为字符串


嘿Kunu,既Map也不是JsonObject都不能正常工作。 - chris
使用Postman来检查你的响应。 - Kunu
兄弟,你检查了错误吗?回应是false...因为有错误。 - chris
你想发送一个Json数组还是一个Json对象? - Kunu
检查一下我的答案。 - Kunu
显示剩余7条评论

7

我使用下面的代码将JSONArray发布到Volley。您必须使用JsonArrayRequest并直接传递JSON数组,而不将其添加到任何JSONObject中。还要记住覆盖“parseNetworkResponse”方法,以再次将响应转换为JSONArray,因为JsonArrayRequest的ResponseListner期望JSONArray类型。

    String URL = "www.myposturl.com/data";

    RequestQueue queue = Volley.newRequestQueue(this);

    //Create json array for filter
    JSONArray array = new JSONArray();

    //Create json objects for two filter Ids
    JSONObject jsonParam = new JSONObject();
    JSONObject jsonParam1 = new JSONObject();

    try {
        //Add string params
        jsonParam.put("NAME", "XXXXXXXXXXXXXX");
        jsonParam.put("USERNAME", "XXXXXXXXXXXXXX");
        jsonParam.put("PASSWORD", "XXXXXXXXXXXX");
        jsonParam1.put("NAME", "XXXXXXXXXXXXXX");
        jsonParam1.put("USERNAME", "XXXXXXXXXXXXXX");
        jsonParam1.put("PASSWORD", "XXXXXXXXXXXX");
    } catch (JSONException e) {
        e.printStackTrace();
    }

    array.put(jsonParam);
    array.put(jsonParam1);
    JsonArrayRequest request_json = new JsonArrayRequest(Request.Method.POST, URL, array,
            new Response.Listener<JSONArray>() {
                @Override
                public void onResponse(JSONArray response) {
                    //Get Final response
                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError volleyError) {
            VolleyLog.e("Error: ", volleyError.getMessage());

        }
    }) {
        @Override
        public Map<String, String> getHeaders() throws AuthFailureError {
            Map<String, String> headers = new HashMap<String, String>();
            // Add headers
            return headers;
        }
        //Important part to convert response to JSON Array Again
        @Override
        protected Response<JSONArray> parseNetworkResponse(NetworkResponse response) {
            String responseString;
            JSONArray array = new JSONArray();
            if (response != null) {

                try {
                    responseString = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
                    JSONObject obj = new JSONObject(responseString);
                    (array).put(obj);
                } catch (Exception ex) {
                }
            }
            //return array;
            return Response.success(array, HttpHeaderParser.parseCacheHeaders(response));
        }
    };
    queue.add(request_json);

1
你通过覆盖parseNetworkResponse这一伟大的技巧拯救了我的一天! - iOS-Coder
我长时间寻找最恰当的答案,现在终于在这里结束了。我非常感激这位先生,太棒了! - Triaro

3
{
"typeName": "MANUFACTURER",
"typeId": 22,
"cityId": 308,
"sortBy": "productname",
"sortOrder": "desc",
"filter":[
            {
                "filterId":101,
                "typeName":"CAT_ID",
             }
             {
                 "filterId":102,
                "typeName":"CAT_ID"
            }
         ]
}


JSONObject object=new JSONObject();
object.put("typeName","");
object.put("typeId","");
object.put("cityId","");
object.put("sortBy","");
object.put("sortOrder","");
JSONArray array=new JSONArray();
JSONObject obj=new JSONObject();
obj.put("filterId","");
obj.put("typeName","");
array.put(obj);
object.put("filter",obj.toString());

将 JSONObject 传递给请求。请使用此链接中的方法进行解析: https://www.androidhive.info/2014/09/android-json-parsing-using-volley/

1
但是我需要添加两个filterId,我该如何添加? - chris
您可以创建多个JSONObject并将它们添加到JSONArray中。 - D.J
我猜想这是不可能的。 - chris
哦,是的,我照你说的方式创建了。但现在出现了一个奇怪的问题。如果我添加cityId,就得不到响应。但是如果我删除cityId,就可以得到响应。WebService在Postman和其他工具中都正常工作,所以没有任何问题。你能帮忙吗? - chris
你能帮我吗? - chris

2
希望这能帮到你。
    //Create Main jSon object
    JSONObject jsonParams = new JSONObject();

    try {
        //Add string params
        jsonParams.put("typeName", "MANUFACTURER");
        jsonParams.put("typeId", "22");
        jsonParams.put("cityId", "308");
        jsonParams.put("sortBy", "productname");
        jsonParams.put("sortOrder", "desc");
    } catch (JSONException e) {
        e.printStackTrace();
    }
    //Create json array for filter
    JSONArray array=new JSONArray();

    //Create json objects for two filter Ids
    JSONObject jsonParam1 =new JSONObject();
    JSONObject jsonParam2 =new JSONObject();

    try {

        jsonParam1.put("filterId","101");
        jsonParam1.put("typeName","CAT_ID");

        jsonParam2.put("filterId","102");
        jsonParam2.put("typeName","CAT_ID");
    } catch (JSONException e) {
        e.printStackTrace();
    }

    //Add the filter Id object to array
    array.put(jsonParam1);
    array.put(jsonParam2);

    //Add array to main json object
    try {
        jsonParams.put("filter",array);
    } catch (JSONException e) {
        e.printStackTrace();
    }

如需了解如何创建json对象,请查看此链接

Android JSONObject:将数组添加到put方法中

编辑

如果有更多数据,最好使用Gson转换器

http://www.vogella.com/tutorials/JavaLibrary-Gson/article.html

另外,要创建pojo类,请使用此链接

http://www.jsonschema2pojo.org/


不行..过滤器ID和类型名称可能有无数个..可能是1个、5个或2个..不能假设它们..它们是动态的。 - chris
已经编辑了答案,请检查一下,这是最简单的方法。 - Sharath kumar

2

嗨,Volley不支持JsonArray请求,最好使用其他库...


Volley是一个开源库,允许您自定义其源代码以引入新的构造函数和方法覆盖。因此,仅为了获得这种增强支持而替换Volley并不明智。 - Pratap Singh

0
以下三个步骤应该能够使旧的Volley库具备这种支持。
  1. 准备有效载荷并发送:

                        JSONArray payloadItems = new JSONArray();
    
                  JSONObject payloadItem1=new JSONObject();
                 //在item1上设置属性
                 payloadItem1.put('prop1',"val11");
    
                  payloadItems.put(payloadItem1);
    
                 JSONObject payloadItem2=new JSONObject();
                 //在item2上设置属性
                 payloadItem2.put('prop1',"val12");
    
                 payloadItems.put(payloadItem1);
    
    
                 JsonArrayRequest request;
    
                 request = new JsonArrayRequest(Request.Method.POST,url,payloadItems, new Response.Listener<JSONArray>() {
                    @SuppressWarnings("unchecked")
                    @Override
                    public void onResponse(JSONArray response) {
                        //处理响应的逻辑
                    }
                }, new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        //处理错误的逻辑
                    }
                }) {
    
                    public Map<String, String> getHeaders() throws AuthFailureError {
                        Map<String,String> params = new HashMap<String, String>();
                        /* 这非常重要 */
                        params.put("Content-Type","application/json");
                        //如果有其他头部,请添加
                        return params;
                    }
    
                     };
    
    
    
    
                    request.setRetryPolicy(new DefaultRetryPolicy(10000, 2, 2));
                    VolleyHelper.init(this);
                    VolleyHelper.getRequestQueue().add(request);
    
  2. [如有需要] 如果Volley包中的JsonArrayRequest类没有此构造函数,请添加:

      public JsonArrayRequest(int method, String url, JSONArray jsonArray, Listener<JSONArray> listener, ErrorListener errorListener) {
        super(method, url, (jsonArray == null) ? null : jsonArray.toString(),
                listener, errorListener);
    

    }

  3. [如有需要] 如果尚未实现,请重写此方法以支持从服务器返回JSONArray响应。

     @Override
     protected Response<JSONArray> parseNetworkResponse(NetworkResponse response) {
         String responseString;
         JSONArray array = new JSONArray();
         if (response != null) {
    
             try {
                 responseString = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
                 JSONObject obj = new JSONObject(responseString);
                 (array).put(obj);
             } catch (Exception ex) {
             }
         }
         //return array;
         return Response.success(array, HttpHeaderParser.parseCacheHeaders(response));
     }
    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接