カテゴリー
コンピューター

【Android】多次元の JSON オブジェクトを作る♪それを Volley で POST する!

ポイント

  • JSON 内部の配列部分を作るには、JSONArray を使う。
  • この JSONArray を JSONObject.put メソッドの value にセットしてやれば良い。
  • Volley ライブラリの JsonObjectRequest をインスタンス化し、RequestQueue.add メソッドの引数とすることで URL にアクセスできる。
  • JsonObjectRequest をインスタンス化するときに、URL、リクエストデータ、レスポンス時の挙動オブジェクト、エラー時の挙動オブジェクトを引数にセットする。

JSON オブジェクトを作って Volley で POST する。完成したコード全体!

    private static final String url = "https://oki2a24.com/test/recieveJson.php";
    private List<Item> itemList;

    private class Item {
        private String name;
        private String value;

        public JSONObject  toJson() {
             JSONObject jsonObject = new JSONObject();
             jsonObject.put("name", name);
             jsonObject.put("value", value);
             return jsonObject;
         }
    }

    /**
     * JSON データを作成し、サーバへ送信します。
     */
    private void sendList() {
        // このメソッドに来る前に、フィールドの itemList にはオブジェクトが詰まっているものとする

        // サーバからのレスポンス時の挙動を定義
        Response.Listener<JSONObject> listener = new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {
                // 今回はサーバからのレスポンスに対し、特に何も行わない
            }
        };
        // エラー時の挙動を定義
        Response.ErrorListener errorListener = new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.e(TAG, "onResponse error=" + error);
            }
        };

        try {
            // サーバへ送信するデータの生成
            JSONObject jsonRequest = new JSONObject();

            // itemList の要素を JSON へ変換し、JSON の配列へ格納
            JSONArray itemArray = new JSONArray();
            for (Item item: itemList) {
                JSONObject itemJson = item.toJson();
                itemArray.put(itemJson);
            }

            jsonRequest.put("itemList", itemArray);

            // サーバへデータ送信
            JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(url, jsonRequest, listener, errorListener);
            requestQueue.add(jsonObjectRequest);
        } catch (JSONException e) {
            e.printStackTrace();
        }

    }

これにより、たとえば次のようなデータをサーバに送ることができました!

デコード前のテキストの状態。

{"itemList":[{"_id":"1","productQuantity":"5889","productName":"サンプル商品A"},{"_id":"2","productQuantity":"35","productName":"サンプル商品A"},{"_id":"3","productQuantity":"658999","productName":"サンプル商品A"}]}

デコード後の読みやすくなった状態。

object(stdClass)#1 (1) {
  ["itemList"]=>
  array(3) {
    [0]=>
    object(stdClass)#2 (3) {
      ["_id"]=>
      string(1) "1"
      ["productQuantity"]=>
      string(4) "5889"
      ["productName"]=>
      string(19) "サンプル商品A"
    }
    [1]=>
    object(stdClass)#3 (3) {
      ["_id"]=>
      string(1) "2"
      ["productQuantity"]=>
      string(2) "35"
      ["productName"]=>
      string(19) "サンプル商品A"
    }
    [2]=>
    object(stdClass)#4 (3) {
      ["_id"]=>
      string(1) "3"
      ["productQuantity"]=>
      string(6) "658999"
      ["productName"]=>
      string(19) "サンプル商品A"
    }
  }
}

階層構造を持つ、ちょっと複雑な JSON を作るコード♪

  • JSON 内部の配列部分を作るには、JSONArray を使う。
  • この JSONArray を JSONObject の value にセットしてやれば良い。

最初、JSONArray を使わずに Item クラスの配列を JSONObject.put メソッドの第2引数である value に設定してみました。そうしましたら、エラーとなってしまいましたの><。

            // サーバへ送信するデータの生成
            JSONObject jsonRequest = new JSONObject();

            // itemList の要素を JSON へ変換し、JSON の配列へ格納
            JSONArray itemArray = new JSONArray();
            for (Item item: itemList) {
                JSONObject itemJson = item.toJson();
                itemArray.put(itemJson);
            }

            jsonRequest.put("itemList", itemArray);

JSON を Volley を使って POST する

ボタンクリックのリスナー内で次のようなメソッドを呼ぶことで POST できました。

  /**
     * JSON データを作成し、サーバへ送信します。
     */
    private void sendList() {
        // サーバからのレスポンス時の挙動を定義(後で JsonObjectRequest の引数になる)
        Response.Listener<JSONObject> listener = new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {
                // 今回はサーバからのレスポンスに対し、特に何も行わない
            }
        };
        // エラー時の挙動を定義(後で JsonObjectRequest の引数になる)
        Response.ErrorListener errorListener = new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.e(TAG, "onResponse error=" + error);
            }
        };

        try {
            // サーバへ送信するデータ
            JSONObject jsonRequest = new JSONObject();
            jsonRequest.put("title", "JSON のてすとでーす♪");

            // サーバへデータ送信
            JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(url, jsonRequest, listener, errorListener);
            requestQueue.add(jsonObjectRequest);
        } catch (JSONException e) {
            e.printStackTrace();
        }

    }

実際に POST できたかどうかは、以前の投稿のやり方で確認しました。冒頭のようなデータが得られましたの♪

おわりに

JSON を Android アプリで受け取ってリスト表示するといったウェブページはたくさんございました。

しかし、JSON データを作成して、それをウェブサーバへ POST 送信したいときに参考となるページは見つけられませんでしたの><。試行錯誤するときに参考にさせていただいたページなどを紹介いたします。

JsonObjectRequest に設定する引数は、解説がなくとも見ればわかるでしょう?とご指摘いただけそうですけれども、馴染みのないコードを書く時はおっかなびっくりですの。

書き上がってみれば納得の行く、短いソースですけれども、そこに至るまでは多くの試行錯誤がございます。

ですから、できた!となったら残すのですわ♪

以上です。

コメントを残す