【Androidでデータやファイルと戯れる】JSONObjectからデータを取り出す
JSONとはRFC 4627とRFC 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; } }