web-dev-qa-db-ja.com

ボレーでJSON配列をポストリクエストとして送信するにはどうすればよいですか?

私は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"
                }
             ]
}

コードチェックペースト用

https://Pastebin.com/u5qD8e2j

9
chris

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の実装も同様です。 JsonObjectRequestの代わりにJsonArrayRequestを使用し、jObjectの代わりにjArrayを送信します。

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配列を文字列に変換しています

10
Kunu

これがお役に立てば幸いです。

    //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メソッドに配列を追加

[〜#〜] edit [〜#〜]

データが多い場合は、Gsonコンバーターを使用することをお勧めします

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

また、pojoクラスを作成するためにこれを使用します

http://www.jsonschema2pojo.org/

2
sharath kumar

こんにちはVolleyはJsonArrayリクエストをサポートしていません。

2
Shanmugam

JSONArrayをボレーに投稿するために以下のコードを使用しました。 JsonArrayRequestを使用し、JSONObjectに追加せずにJSON配列を直接渡す必要があります。また、「parseNetworkResponse」メソッドをオーバーライドして、JsonArrayRequestのResponseListnerがJSONArrayのタイプを想定しているため、応答を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);
2
Neuron
{
"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/

2