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

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

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

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

JSONObjectから確実に存在するnameのデータを取得する

JSONObjectにはデータを取り出すメソッドが複数あります。
下記のメソッドでは、指定したnameが存在し、型が一致している必要があります。
int getInt(String name) 指定したnameに設定されているvalueを取得します。
この時、nameが存在しない場合やvalueがint型ではない場合はJSONExceptionがスローされます。
long getLong(String name) 指定したnameに設定されているvalueを取得します。
この時、nameが存在しない場合やvalueがlong型ではない場合はJSONExceptionがスローされます。
double getDouble(String name) 指定したnameに設定されているvalueを取得します。
この時、nameが存在しない場合やvalueがdouble型ではない場合はJSONExceptionがスローされます。
boolean getBoolean(String name) 指定したnameに設定されているvalueを取得します。
この時、nameが存在しない場合やvalueがboolean型ではない場合はJSONExceptionがスローされます。
String getString(String name) 指定したnameに設定されているvalueを取得します。
この時、nameが存在しない場合やvalueがString型ではない場合はJSONExceptionがスローされます。
JSONObject getJSONObject(String name) 指定したnameに設定されているvalueを取得します。
この時、nameが存在しない場合やvalueがオブジェクトではない場合はJSONExceptionがスローされます。
JSONArray getJSONArray(String name) 指定したnameに設定されているvalueを取得します。
この時、nameが存在しない場合やvalueがアレイではない場合はJSONExceptionがスローされます。
Object get(String name) 指定したnameに設定されているvalueを取得します。
この時、nameが存在しない場合はJSONExceptionがスローされます。

JSONObjectから存在するかわからないnameのデータを取得する

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

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

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

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

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        JSONObject jsonObject = createJSON();
        getDataJSONObject(jsonObject);
        try {
            int anInt = jsonObject.getInt("int");
        } catch (JSONException e) {
            e.printStackTrace();
        }
        jsonObject.length();
    }

    private void getDataJSONObject(JSONObject jsonObject) {
        int getInt;
        int optInt;
        int fallbackInt;
        try {
            getInt = jsonObject.getInt("int");
            optInt = jsonObject.optInt("int");
            fallbackInt = jsonObject.optInt("int1" , 500);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return;
    }

    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;
    }
}