package in.srain.cube.request; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import org.json.JSONTokener; import java.util.*; @SuppressWarnings("rawtypes") public final class JsonData { private Object mJson; private static final String EMPTY_STRING = ""; public static JsonData newMap() { return create(new HashMap<String, Object>()); } public static JsonData newList() { return create(new ArrayList<Object>()); } public static JsonData create(String str) { Object object = null; if (str != null && str.length() >= 0) { try { JSONTokener jsonTokener = new JSONTokener(str); object = jsonTokener.nextValue(); } catch (Exception e) { } } return create(object); } public static JsonData create(Object o) { JsonData json = new JsonData(); if (o instanceof JSONArray || o instanceof JSONObject) { json.mJson = o; } if (o instanceof Map) { json.mJson = new JSONObject((Map) o); } if (o instanceof Collection) { json.mJson = new JSONArray((Collection) o); } return json; } public Object getRawData() { return mJson; } public JsonData optJson(String name) { Object ret = null; if (mJson instanceof JSONObject) { ret = ((JSONObject) mJson).opt(name); } return JsonData.create(ret); } public JsonData optJson(int index) { Object ret = null; if (mJson instanceof JSONArray) { ret = ((JSONArray) mJson).opt(index); } return JsonData.create(ret); } public String optString(String name) { return optMapOrNew().optString(name); } public String optString(String name, String fallback) { return optMapOrNew().optString(name, fallback); } public String optString(int index) { return optArrayOrNew().optString(index); } public String optString(int index, String fallback) { return optArrayOrNew().optString(index, fallback); } public int optInt(String name) { return optMapOrNew().optInt(name); } public int optInt(String name, int fallback) { return optMapOrNew().optInt(name, fallback); } public int optInt(int index) { return optArrayOrNew().optInt(index); } public int optInt(int index, int fallback) { return optArrayOrNew().optInt(index, fallback); } public boolean optBoolean(String name) { return optMapOrNew().optBoolean(name); } public boolean optBoolean(String name, boolean fallback) { return optMapOrNew().optBoolean(name, fallback); } public boolean optBoolean(int index) { return optArrayOrNew().optBoolean(index); } public boolean optBoolean(int index, boolean fallback) { return optArrayOrNew().optBoolean(index, fallback); } public double optDouble(String name) { return optMapOrNew().optDouble(name); } public double optDouble(String name, double fallback) { return optMapOrNew().optDouble(name, fallback); } public double optDouble(int index) { return optArrayOrNew().optDouble(index); } public double optDouble(int index, double fallback) { return optArrayOrNew().optDouble(index, fallback); } public boolean has(String name) { return optMapOrNew().has(name); } public boolean has(int index) { return optArrayOrNew().length() > index; } public JSONObject optMapOrNew() { if (mJson instanceof JSONObject) { return (JSONObject) mJson; } return new JSONObject(); } private Object valueForPut(Object value) { if (value instanceof JsonData) { return ((JsonData) value).getRawData(); } else { return value; } } public void put(String key, Object value) { if (mJson instanceof JSONObject) { try { ((JSONObject) mJson).put(key, valueForPut(value)); } catch (JSONException e) { e.printStackTrace(); } } } public void put(Object value) { if (mJson instanceof JSONArray) { ((JSONArray) mJson).put(valueForPut(value)); } } public void put(int index, Object value) { if (mJson instanceof JSONArray) { try { ((JSONArray) mJson).put(index, valueForPut(value)); } catch (JSONException e) { e.printStackTrace(); } } } public JsonData editMap(int index) { if (has(index)) { return optJson(index); } JsonData map = JsonData.newMap(); put(index, map); return map; } public JsonData editMap() { JsonData map = JsonData.newMap(); put(map); return map; } public JsonData editMap(String key) { if (has(key)) { return optJson(key); } JsonData map = JsonData.newMap(); put(key, map); return map; } public JsonData editList(String key) { if (has(key)) { return optJson(key); } JsonData list = JsonData.newList(); put(key, list); return list; } public JsonData editList(int index) { if (has(index)) { return optJson(index); } JsonData list = JsonData.newList(); put(index, list); return list; } public JsonData editList() { JsonData list = JsonData.newList(); put(list); return list; } public JSONArray optArrayOrNew() { if (mJson instanceof JSONArray) { return (JSONArray) mJson; } return new JSONArray(); } public int length() { if (mJson instanceof JSONArray) { return ((JSONArray) mJson).length(); } if (mJson instanceof JSONObject) { return ((JSONObject) mJson).length(); } return 0; } @SuppressWarnings("unchecked") public Iterator<String> keys() { return optMapOrNew().keys(); } public String toString() { if (mJson instanceof JSONArray) { return ((JSONArray) mJson).toString(); } else if (mJson instanceof JSONObject) { return ((JSONObject) mJson).toString(); } return EMPTY_STRING; } public ArrayList<JsonData> toArrayList() { ArrayList<JsonData> arrayList = new ArrayList<JsonData>(); if (mJson instanceof JSONArray) { final JSONArray array = (JSONArray) mJson; for (int i = 0; i < array.length(); i++) { arrayList.add(i, JsonData.create(array.opt(i))); } } else if (mJson instanceof JSONObject) { final JSONObject json = (JSONObject) mJson; Iterator it = json.keys(); while (it.hasNext()) { String key = (String) it.next(); arrayList.add(JsonData.create(json.opt(key))); } } return arrayList; } }