JSONは文字や数値などデータを一つにまとめることができ、パースもしやすくとても便利です。
またほとんどの言語で扱える形式のため、データ通信で使うのに適しています。
今回はAndroidでJSONを扱うためのクラスについてまとめました。
JSONとは
JSONは人が容易に読み書きができ、言語ごとのパースも簡単に行なえるデータ形式です。
連想配列と配列の二つで表されます。
連想配列は名前と値によって次のように要素を表します。
{"名前1":値1, "名前2":値2}
全体を{}(中括弧)で囲み、名前と値を:(コロン)で区切ります。要素は,(カンマ)で区切ります。
名前は文字列型でなければなりません。
値の取得や追加には名前を使います。
配列で要素を表す場合は値のみを[](大括弧)で囲み、要素を,(カンマ)で区切ります。
[値1,値2,値3,]
値の取得には要素番号を使います。
値には文字列、数値、BOOL値、オブジェクトなど様々なものを指定できます。
サンプルを用意しました。
このように、JSONデータの中にJSONや配列が含まれていても問題ありません。
この場合、2行目の”string”が表すのが”名前”という文字列になります。
ソース
こちらが今回の全体コードです。
開発環境はAndroid Studio3.0.1です。
実行結果では次のようにログが出力されます。
D/sample: JSONObject:{"int":30,"string":"文字列","bool":true} D/sample: toStringでの展開:{"int":30,"string":"文字列","bool":true} D/sample: intの取得:30 D/sample: JSONArray:[100,"strong",false] D/sample: Arrayの追加:{"int":30,"string":"文字列","bool":true,"arr":[100,"strong",false]} D/sample: piyoがありません D/sample: end try-catch
JSONObject
JSONObjectは連想配列のJSONです。
次の二つのインポートが必要です。
import org.json.JSONObject;
import org.json.JSONException;
JSONObjectへのデータの追加と取得はtry-catch文の中で行う必要があります。
JSONObject json = new JSONObject(); try{ // ここに処理を書く }catch(JSONException e){ e.printStackTrace(); }
データの追加は次のように書きます。
JSONObject.put("名前",値);
次のように書くと連続して追加できます。
JSONObject.put("名前1",値) .put("名前2",値) .put("名前3",値);
データの取得にはgetを使います。
取得したい型によって呼び出し方が変わります。
また独自のクラスを取得する場合にはキャストを使います。
int i = JSONObject.getInt("名前");
JSONObject j = JSONObject.getJSONObject("名前");
独自のクラス c = (独自のクラス)JSONObject.get("名前");
JSONObjectでは配列は扱えないため注意が必要です。
JSONArray
JSONの配列を扱う場合に使います。
JSONArrayを使うには次のインポートが必要です。
import org.json.JSONArray;
JSONArrayは名前の代わりに要素番号を使います。
JSONArray array = new JSONArray(); array.put(100) .put("文字列"); int i = array.getInt(0);
データを一つにまとめる
toStringを使うことでデータを一つの文字列に変換することができます。
String obj = JSONObject.toString();
String arr = JSONArray.toString();
これによりデータの送信や保存時の処理を一括して行うことができます。
またこのまとめたデータをJSONObjecに戻す際は次のようにします。
String strObj = JSONObject.toString();
JSONObject obj = new JSONObject(strObj);
String strArr = JSONArray.toString();
JSONArray arr = new JSONArray(strArr);
データの確認
受け取ったJSONデータを使おうとした時、必要なデータがないとアプリによっては動作を停止することがあります。
それを防ぐために、受け取ったデータが存在するか確認する必要があります。
今回はJSONObject.has()を使いましたが、コードによっては別の方法で確認するかもしれません。
JSONObject receive = new JSONObject(); receive.put("hoge","hoge") .put("huga","huga"); if(receive.has("piyo")){ // piyoが存在する時の処理 }else{ // piyoが存在しない時の処理 }
まとめ
このように、AndroidでもJSONを使うことができます。
JSONObjectやJSONArrayを使えば、アプリがサーバとの通信をする時にデータのやりとりが簡単になります。
参考
エンジニア1年目です。
日々勉強したことをまとめていきたいと思います。