ポイント
- 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 に設定する引数は、解説がなくとも見ればわかるでしょう?とご指摘いただけそうですけれども、馴染みのないコードを書く時はおっかなびっくりですの。
書き上がってみれば納得の行く、短いソースですけれども、そこに至るまでは多くの試行錯誤がございます。
ですから、できた!となったら残すのですわ♪
以上です。
