【Androidでデータやファイルと戯れる】JSONObjectを使ってJSONオブジェクトを組み立てる

このエントリーを Google ブックマーク に追加
Pocket
[`yahoo` not found]

JSONとはRFC 4627RFC 7159で規定される構造化された文字列のことです。

AndroidでJSONを取り扱うにはorg.jsonパッケージを使用します。
今回は、JSONObjectを使ったJSONの生成を行います。

JSONObjectのインスタンス化

JSONObjectはJSONで言うところのオブジェクト(“{}”)を表現するクラスです。
JSONObjectには複数のコンストラクタが存在しますが、今回は空っぽの状態から始めるため、引数を持たないJSONObject()を使用します。
この時、生成されたJSONObjectインスタンスは”{}”というJSON文字列を表すインスタンスとなります。
    JSONObject jsonObject = new JSONObject();

JSONObjectにデータを配置する

オブジェクト内には0個以上のname/valueペア(members)を配置することができます。
nameは文字列、valueはint・long・double・boolean・String・Object・Arrayを配置することが可能です。
配置するメソッドJSONObject#putは上記の型の違いに応じたオーバーロードが存在しています。
オーバーロードは下記のとおりです。
JSONObject put(String name, int value) nameを指定してint型のvalueをオブジェクトに追加します。すでに同名のnameがある場合は指定したvalueで上書きします。
nameにnullを渡すとJSONExceptionが発生します。
JSONObject put(String name, long value) nameを指定してlong型のvalueをオブジェクトに追加します。すでに同名のnameがある場合は指定したvalueで上書きします。
nameにnullを渡すとJSONExceptionが発生します。
JSONObject put(String name, double value) nameを指定してdouble型のvalueをオブジェクトに追加します。すでに同名のnameがある場合は指定したvalueで上書きします。
nameにnullを渡すとJSONExceptionが発生します。
JSONObject put(String name, boolean value) nameを指定してboolean型のvalueをオブジェクトに追加します。すでに同名のnameがある場合は指定したvalueで上書きします。
nameにnullを渡すとJSONExceptionが発生します。
JSONObject put(String name, Object value) nameを指定してObject型のvalueをオブジェクトに追加します。すでに同名のnameがある場合は指定したvalueで上書きします。
Object型はString・Boolean・Integer・Long・Double・NULL・nullやJSONObject(オブジェクト)やJSONArray(配列)を指定することができます。
nameにnullを渡すとJSONExceptionが発生します。
JSONObject accumulate(String name, Object value) 指定したnameにvalueを追加します。
オブジェクトの状況によって動作が下記のようになります。
nameにnullを渡すとJSONExceptionが発生します。
  1. nameが存在しない : valueを配列として追加する。
  2. nameが存在し、既存のvalueが配列ではある : 既存の配列valueにvalueを追加する。
  3. nameが存在し、既存のvalueが配列ではない : 既存のvalueを配列に変換しvalueを追加する。
JSONObject putOpt(String name, Object value) put(name, value)の2つのパラメータはnull以外の値を設定する必要がありますが、このメソッドはnullを許可します。

JSONObjectを使ってJSONを組み立てる

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        JSONObject jsonObject = createJSON();
    }

    private JSONObject createJSON() {
        JSONObject jsonObject = new JSONObject();
        try {
            jsonObject.put("boolean" , true)
                    .put("double" , 10.5)
                    .put("int" , 100)
                    .put("long" , 18000305032230531L)
                    .put("string" , "string")
                    .put("object" , createJSONObject(5))
                    .put("array" , createJSONArray(5))
                    .putOpt(null, JSONObject.NULL)
                    .put("put null", JSONObject.NULL)
                    .put("array" , createJSONArray(5))
                    .accumulate("accumulate" , 1)
                    .accumulate("accumulate" , 2)
                    .accumulate("accumulate" , 3);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        Log.d("JSON", "onCreate: " + jsonObject.toString());
        return jsonObject;
    }

    private JSONObject createJSONObject(int count) {
        JSONObject jsonObject = new JSONObject();
        try {
            for(int i = 0 ; i < count ; i ++){
                jsonObject.put("JSON_OBJECT_"+ i , i);
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return jsonObject;
    }

    private JSONArray createJSONArray(int count){
        JSONArray jsonArray = new JSONArray();
        try {
            for(int i = 0 ; i < count ; i ++){
                    jsonArray.put(i , i);
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return jsonArray;
    }
}