【Androidでデータやファイルと戯れる】JSONArrayからデータを取り出す

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

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

AndroidでJSONを取り扱うにはorg.jsonパッケージを使用します。
今回は、JSONArrayからデータを取り出します。

JSONArrayから確実に存在する要素番号のデータを取得する

JSONArrayにはデータを取り出すメソッドが複数あります。
下記のメソッドでは、指定した要素番号が存在し、型が一致している必要があります。
boolean getBoolean(int index)
int getInt(int index)
long getLong(int index)
double getDouble(int index)
String getString(int index)
JSONObject getJSONObject(int index)
JSONArray getJSONArray(int index)
Object get(int index)

JSONArrayから存在するかわからない要素番号のデータを取得する

JSONArray#getXXX系のメソッドは型が一致しない場合は、JSONExceptionがスローされます。
下記のJSONArray#optXXX系のメソッドは型が一致しない場合にJSONExceptionがスローはされず規定の値を返却します。
boolean optBoolean(int index) 指定した要素番号の値を取得します。
この時、要素番号の値が存在しない場合、または型が一致しない場合はfalseが返却されます。
int optInt(int index) 指定した要素番号の値を取得します。
この時、要素番号の値が存在しない場合、または型が一致しない場合は0が返却されます。
また、long型・double型の場合はint型にキャストされます。
long optLong(int index) 指定した要素番号の値を取得します。
この時、要素番号の値が存在しない場合、または型が一致しない場合は0が返却されます。
また、int型・double型の場合はlong型にキャストされます。
double optDouble(int index) 指定した要素番号の値を取得します。
この時、要素番号の値が存在しない場合、または型が一致しない場合は0が返却されます。
また、int型・long型の場合はdouble型にキャストされます。
String optString(int index) 指定した要素番号の値を取得します。
この時、要素番号の値が存在しない場合は空文字が返却されます。
また、String型以外の値はObject#toString等を使い文字列に変換されます。
JSONArray optJSONArray(int index) 指定した要素番号の値を取得します。
この時、要素番号の値が存在しない場合、または型が一致しない場合はnullが返却されます。
JSONObject optJSONObject(int index) 指定した要素番号の値を取得します。
この時、要素番号の値が存在しない場合、または型が一致しない場合はnullが返却されます。
Object opt(int index) 指定した要素番号の値を取得します。
この時、要素番号の値が存在しない場合、または型が一致しない場合はnullが返却されます。

JSONArrayから代替値を指定してデータを取得する

JSONArray#optXXX系の幾つかのメソッドにはオーバーロードが存在します。
オーバーロードのメソッドには第二引数が存在し、この引数にした値が、型が一致する要素番号が存在しない場合に返却されます。
boolean optBoolean(int index, boolean fallback) 指定した要素番号の値を取得します。
この時、要素番号の値が存在しない場合、または型が一致しない場合はfallbackが返却されます。
int optInt(int index, int fallback) 指定した要素番号の値を取得します。
この時、要素番号の値が存在しない場合、または型が一致しない場合はfallbackが返却されます。
long optLong(int index, long fallback) 指定した要素番号の値を取得します。
この時、要素番号の値が存在しない場合、または型が一致しない場合はfallbackが返却されます。
double optDouble(int index, double fallback) 指定した要素番号の値を取得します。
この時、要素番号の値が存在しない場合、または型が一致しない場合はfallbackが返却されます。
String optString(int index, String fallback) 指定した要素番号の値を取得します。
この時、要素番号の値が存在しない場合、または型が一致しない場合はfallbackが返却されます。

JSONObjectからデータを取得するサンプル

public class JsonArrayActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        JSONArray jsonArray = createJSON();
        getDataFromJSONArray(jsonArray);
    }

    private void getDataFromJSONArray(JSONArray jsonArray) {
        try {
            Log.d("JSONArray", "getBoolean : " + jsonArray.getBoolean(0));
            Log.d("JSONArray", "getInt : " + jsonArray.getInt(1));
            Log.d("JSONArray", "getLong : " + jsonArray.getLong(2));
            Log.d("JSONArray", "getDouble : " + jsonArray.getDouble(3));
            Log.d("JSONArray", "getString : " + jsonArray.getString(4));
            Log.d("JSONArray", "getJSONObject : " + jsonArray.getJSONObject(5));
            Log.d("JSONArray", "getJSONArray : " + jsonArray.getJSONArray(6));
            Log.d("JSONArray", "get : " + jsonArray.get(7));
            Log.d("JSONArray", "optBoolean : " + jsonArray.optBoolean(0));
            Log.d("JSONArray", "optInt : " + jsonArray.optInt(1));
            Log.d("JSONArray", "optLong : " + jsonArray.optLong(2));
            Log.d("JSONArray", "optDouble : " + jsonArray.optDouble(3));
            Log.d("JSONArray", "optString : " + jsonArray.optString(4));
            Log.d("JSONArray", "optJSONObject : " + jsonArray.optJSONObject(5));
            Log.d("JSONArray", "optJSONArray : " + jsonArray.optJSONArray(6));
            Log.d("JSONArray", "opt : " + jsonArray.opt(7));
            Log.d("JSONArray", "optBoolean fallback : " + jsonArray.optBoolean(100, false));
            Log.d("JSONArray", "optInt fallback : " + jsonArray.optInt(100, 1000));
            Log.d("JSONArray", "optLong fallback : " + jsonArray.optLong(100, 10000000000000000L));
            Log.d("JSONArray", "optDouble fallback : " + jsonArray.optDouble(100, 20.5));
            Log.d("JSONArray", "optString fallback : " + jsonArray.optString(100, "StringString"));
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

    private JSONArray createJSON() {
        JSONArray jsonArray = new JSONArray();
        try {
            jsonArray.put(true);
            jsonArray.put(100);
            jsonArray.put(18000305032230531L);
            jsonArray.put(10.5);
            jsonArray.put("String");
            jsonArray.put(createJSONObject(5));
            jsonArray.put(createJSONArray(5));
            jsonArray.put(new HashMap<>());
            jsonArray.put(new ArrayList<>());
            jsonArray.put(10, false);
            jsonArray.put(15, 200);
            jsonArray.put(20, 10000000000000000L);
            jsonArray.put(25, 20.5);
            jsonArray.put(30, createJSONObject(1));
            jsonArray.put(35, createJSONArray(1));
            jsonArray.put(40, new HashMap<>());
            jsonArray.put(45, new ArrayList<>());
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return jsonArray;
    }
}