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