ポイント
- 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 送信したいときに参考となるページは見つけられませんでしたの><。試行錯誤するときに参考にさせていただいたページなどを紹介いたします。
- JSONってなにもの? | Think IT(シンクイット)
→ JSON とは?の参考に - [基本] HashMap、HashSet、ArrayListのループ処理サンプル | keiのTECブログ
→ ArrayList のループの回し方の参考に - anney’s room – ぷめも – JSON
→ 多次元構造の JSON データを作る参考に - ネットワーク通信用ライブラリVolleyを使いこなす | Tech Booster
→ Volley の使い方の参考に - アプリ開発者を育てるプログラミングスクール Tech Institute(テックインスティチュート)
→ Vol.4 ステップアップ編 Chapter 10 が Volley の使い方の参考に
JsonObjectRequest に設定する引数は、解説がなくとも見ればわかるでしょう?とご指摘いただけそうですけれども、馴染みのないコードを書く時はおっかなびっくりですの。
書き上がってみれば納得の行く、短いソースですけれども、そこに至るまでは多くの試行錯誤がございます。
ですから、できた!となったら残すのですわ♪
以上です。