jsonObjectを利用する時にtry catchで囲む必要があって、変に長くなってしまう。
例えば
{"result":{"status":"OK"}}
を見る時に
try { JSONObject jo = new JSONObject(str); JSONObject result = jo.getJSONObject("result"); String status = result.getString("status"); Log.e("STATUS",status); } catch (JSONException e) { //error handle }
と書くとstatusが出るのだけど、
例えばエラーが発生した時に、
resultがない?
statusがない?
とか分からなくて、確認作業に手間取ってしまいます。
なので、JsonObjectをパース用の関数を別途作ってみました。
JsonUtilというクラスを作って
public static JSONObject toJsonObject(String key){ try { return new JSONObject(key); } catch (JSONException e) { Log.e("JSONUtil Error:JSONObject","KEY:"+key); return new JSONObject(); } } public static JSONObject getJsonObject(JSONArray ja,int num){ try { return ja.getJSONObject(num); } catch (JSONException e) { Log.e("JSONUtil Error:getJsonObject","NUM:"+num); return new JSONObject(); } } public static JSONObject getJsonObject(JSONObject jo,String key){ try { return jo.getJSONObject(key); } catch (JSONException e) { Log.e("JSONUtil Error:getJsonObject","KEY:"+key); return new JSONObject(); } } public static JSONArray getJsonArray(JSONObject jo,String key){ try { return jo.getJSONArray(key); } catch (JSONException e) { Log.e("JSONUtil Error:getJSONArray","KEY:"+key); return new JSONArray(); } } public static String getString(JSONObject jo,String key){ try { return jo.getString(key); } catch (JSONException e) { Log.e("JSONUtil Error:getString","KEY:"+key); return ""; } } public static int getInt(JSONObject jo,String key){ try { return jo.getInt(key); } catch (JSONException e) { Log.e("JSONUtil Error:getInt","KEY:"+key); return 0; } } public static long getLong(JSONObject jo,String key){ try { return jo.getLong(key); } catch (JSONException e) { Log.e("JSONUtil getLong","KEY:"+key); return 0; } } public static Boolean getBoolean(JSONObject jo,String key){ try { return jo.getBoolean(key); } catch (JSONException e) { Log.e("JSONUtil Error:getBoolean","KEY:"+key); return false; } }
とすると、パースの処理が
JSONObject jo = JSONUtil.toJsonObject(str); JSONObject result = JSONUtil.getJsonObject(jo, "result"); String status = JSONUtil.getString(result, "status"); Log.e("STATUS",status);
として出力されます。
そして各関数のエラー時にLogを仕込む事でどこで
・どこでエラーが発生しているのか?
・途中でパースの処理が止まらない
というようになり、APIがおかしくても、途中で処理が止まらないようにできました