package cn.trinea.android.common.util; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; /** * Json Utils * * @author <a href="http://www.trinea.cn" target="_blank">Trinea</a> 2012-5-12 */ public class JSONUtils { public static boolean isPrintException = true; private JSONUtils() { throw new AssertionError(); } /** * get Long from jsonObject * * @param jsonObject * @param key * @param defaultValue * @return <ul> * <li>if jsonObject is null, return defaultValue</li> * <li>if key is null or empty, return defaultValue</li> * <li>if {@link org.json.JSONObject#getLong(String)} exception, return defaultValue</li> * <li>return {@link org.json.JSONObject#getLong(String)}</li> * </ul> */ public static Long getLong(JSONObject jsonObject, String key, Long defaultValue) { if (jsonObject == null || StringUtils.isEmpty(key)) { return defaultValue; } try { return jsonObject.getLong(key); } catch (JSONException e) { if (isPrintException) { e.printStackTrace(); } return defaultValue; } } /** * get Long from jsonData * * @param jsonData * @param key * @param defaultValue * @return <ul> * <li>if jsonObject is null, return defaultValue</li> * <li>if jsonData {@link org.json.JSONObject#JSONObject(String)} exception, return defaultValue</li> * <li>return {@link cn.trinea.android.common.util.JSONUtils#getLong(org.json.JSONObject, String, org.json.JSONObject)}</li> * </ul> */ public static Long getLong(String jsonData, String key, Long defaultValue) { if (StringUtils.isEmpty(jsonData)) { return defaultValue; } try { JSONObject jsonObject = new JSONObject(jsonData); return getLong(jsonObject, key, defaultValue); } catch (JSONException e) { if (isPrintException) { e.printStackTrace(); } return defaultValue; } } /** * @param jsonObject * @param key * @param defaultValue * @return * @see cn.trinea.android.common.util.JSONUtils#getLong(org.json.JSONObject, String, Long) */ public static long getLong(JSONObject jsonObject, String key, long defaultValue) { return getLong(jsonObject, key, (Long)defaultValue); } /** * @param jsonData * @param key * @param defaultValue * @return * @see cn.trinea.android.common.util.JSONUtils#getLong(String, String, Long) */ public static long getLong(String jsonData, String key, long defaultValue) { return getLong(jsonData, key, (Long)defaultValue); } /** * get Int from jsonObject * * @param jsonObject * @param key * @param defaultValue * @return <ul> * <li>if jsonObject is null, return defaultValue</li> * <li>if key is null or empty, return defaultValue</li> * <li>if {@link org.json.JSONObject#getInt(String)} exception, return defaultValue</li> * <li>return {@link org.json.JSONObject#getInt(String)}</li> * </ul> */ public static Integer getInt(JSONObject jsonObject, String key, Integer defaultValue) { if (jsonObject == null || StringUtils.isEmpty(key)) { return defaultValue; } try { return jsonObject.getInt(key); } catch (JSONException e) { if (isPrintException) { e.printStackTrace(); } return defaultValue; } } /** * get Int from jsonData * * @param jsonData * @param key * @param defaultValue * @return <ul> * <li>if jsonObject is null, return defaultValue</li> * <li>if jsonData {@link org.json.JSONObject#JSONObject(String)} exception, return defaultValue</li> * <li>return {@link cn.trinea.android.common.util.JSONUtils#getInt(org.json.JSONObject, String, org.json.JSONObject)}</li> * </ul> */ public static Integer getInt(String jsonData, String key, Integer defaultValue) { if (StringUtils.isEmpty(jsonData)) { return defaultValue; } try { JSONObject jsonObject = new JSONObject(jsonData); return getInt(jsonObject, key, defaultValue); } catch (JSONException e) { if (isPrintException) { e.printStackTrace(); } return defaultValue; } } /** * @param jsonObject * @param key * @param defaultValue * @return * @see cn.trinea.android.common.util.JSONUtils#getInt(org.json.JSONObject, String, Integer) */ public static int getInt(JSONObject jsonObject, String key, int defaultValue) { return getInt(jsonObject, key, (Integer)defaultValue); } /** * @param jsonObject * @param key * @param defaultValue * @return * @see cn.trinea.android.common.util.JSONUtils#getInt(String, String, Integer) */ public static int getInt(String jsonData, String key, int defaultValue) { return getInt(jsonData, key, (Integer)defaultValue); } /** * get Double from jsonObject * * @param jsonObject * @param key * @param defaultValue * @return <ul> * <li>if jsonObject is null, return defaultValue</li> * <li>if key is null or empty, return defaultValue</li> * <li>if {@link org.json.JSONObject#getDouble(String)} exception, return defaultValue</li> * <li>return {@link org.json.JSONObject#getDouble(String)}</li> * </ul> */ public static Double getDouble(JSONObject jsonObject, String key, Double defaultValue) { if (jsonObject == null || StringUtils.isEmpty(key)) { return defaultValue; } try { return jsonObject.getDouble(key); } catch (JSONException e) { if (isPrintException) { e.printStackTrace(); } return defaultValue; } } /** * get Double from jsonData * * @param jsonData * @param key * @param defaultValue * @return <ul> * <li>if jsonObject is null, return defaultValue</li> * <li>if jsonData {@link org.json.JSONObject#JSONObject(String)} exception, return defaultValue</li> * <li>return {@link cn.trinea.android.common.util.JSONUtils#getDouble(org.json.JSONObject, String, org.json.JSONObject)}</li> * </ul> */ public static Double getDouble(String jsonData, String key, Double defaultValue) { if (StringUtils.isEmpty(jsonData)) { return defaultValue; } try { JSONObject jsonObject = new JSONObject(jsonData); return getDouble(jsonObject, key, defaultValue); } catch (JSONException e) { if (isPrintException) { e.printStackTrace(); } return defaultValue; } } /** * @param jsonObject * @param key * @param defaultValue * @return * @see cn.trinea.android.common.util.JSONUtils#getDouble(org.json.JSONObject, String, Double) */ public static double getDouble(JSONObject jsonObject, String key, double defaultValue) { return getDouble(jsonObject, key, (Double)defaultValue); } /** * @param jsonObject * @param key * @param defaultValue * @return * @see cn.trinea.android.common.util.JSONUtils#getDouble(String, String, Double) */ public static double getDouble(String jsonData, String key, double defaultValue) { return getDouble(jsonData, key, (Double)defaultValue); } /** * get String from jsonObject * * @param jsonObject * @param key * @param defaultValue * @return <ul> * <li>if jsonObject is null, return defaultValue</li> * <li>if key is null or empty, return defaultValue</li> * <li>if {@link org.json.JSONObject#getString(String)} exception, return defaultValue</li> * <li>return {@link org.json.JSONObject#getString(String)}</li> * </ul> */ public static String getString(JSONObject jsonObject, String key, String defaultValue) { if (jsonObject == null || StringUtils.isEmpty(key)) { return defaultValue; } try { return jsonObject.getString(key); } catch (JSONException e) { if (isPrintException) { e.printStackTrace(); } return defaultValue; } } /** * get String from jsonData * * @param jsonData * @param key * @param defaultValue * @return <ul> * <li>if jsonObject is null, return defaultValue</li> * <li>if jsonData {@link org.json.JSONObject#JSONObject(String)} exception, return defaultValue</li> * <li>return {@link cn.trinea.android.common.util.JSONUtils#getString(org.json.JSONObject, String, org.json.JSONObject)}</li> * </ul> */ public static String getString(String jsonData, String key, String defaultValue) { if (StringUtils.isEmpty(jsonData)) { return defaultValue; } try { JSONObject jsonObject = new JSONObject(jsonData); return getString(jsonObject, key, defaultValue); } catch (JSONException e) { if (isPrintException) { e.printStackTrace(); } return defaultValue; } } /** * get String from jsonObject * * @param jsonObject * @param defaultValue * @param keyArray * @return <ul> * <li>if jsonObject is null, return defaultValue</li> * <li>if keyArray is null or empty, return defaultValue</li> * <li>get {@link #getJSONObject(org.json.JSONObject, String, org.json.JSONObject)} by recursion, return it. if anyone is * null, return directly</li> * </ul> */ public static String getStringCascade(JSONObject jsonObject, String defaultValue, String... keyArray) { if (jsonObject == null || ArrayUtils.isEmpty(keyArray)) { return defaultValue; } String data = jsonObject.toString(); for (String key : keyArray) { data = getStringCascade(data, key, defaultValue); if (data == null) { return defaultValue; } } return data; } /** * get String from jsonData * * @param jsonData * @param defaultValue * @param keyArray * @return <ul> * <li>if jsonData is null, return defaultValue</li> * <li>if keyArray is null or empty, return defaultValue</li> * <li>get {@link #getJSONObject(org.json.JSONObject, String, org.json.JSONObject)} by recursion, return it. if anyone is * null, return directly</li> * </ul> */ public static String getStringCascade(String jsonData, String defaultValue, String... keyArray) { if (StringUtils.isEmpty(jsonData)) { return defaultValue; } String data = jsonData; for (String key : keyArray) { data = getString(data, key, defaultValue); if (data == null) { return defaultValue; } } return data; } /** * get String array from jsonObject * * @param jsonObject * @param key * @param defaultValue * @return <ul> * <li>if jsonObject is null, return defaultValue</li> * <li>if key is null or empty, return defaultValue</li> * <li>if {@link org.json.JSONObject#getJSONArray(String)} exception, return defaultValue</li> * <li>if {@link org.json.JSONArray#getString(int)} exception, return defaultValue</li> * <li>return string array</li> * </ul> */ public static String[] getStringArray(JSONObject jsonObject, String key, String[] defaultValue) { if (jsonObject == null || StringUtils.isEmpty(key)) { return defaultValue; } try { JSONArray statusArray = jsonObject.getJSONArray(key); if (statusArray != null) { String[] value = new String[statusArray.length()]; for (int i = 0; i < statusArray.length(); i++) { value[i] = statusArray.getString(i); } return value; } } catch (JSONException e) { if (isPrintException) { e.printStackTrace(); } return defaultValue; } return defaultValue; } /** * get String array from jsonData * * @param jsonData * @param key * @param defaultValue * @return <ul> * <li>if jsonObject is null, return defaultValue</li> * <li>if jsonData {@link org.json.JSONObject#JSONObject(String)} exception, return defaultValue</li> * <li>return {@link cn.trinea.android.common.util.JSONUtils#getStringArray(org.json.JSONObject, String, org.json.JSONObject)}</li> * </ul> */ public static String[] getStringArray(String jsonData, String key, String[] defaultValue) { if (StringUtils.isEmpty(jsonData)) { return defaultValue; } try { JSONObject jsonObject = new JSONObject(jsonData); return getStringArray(jsonObject, key, defaultValue); } catch (JSONException e) { if (isPrintException) { e.printStackTrace(); } return defaultValue; } } /** * get String list from jsonObject * * @param jsonObject * @param key * @param defaultValue * @return <ul> * <li>if jsonObject is null, return defaultValue</li> * <li>if key is null or empty, return defaultValue</li> * <li>if {@link org.json.JSONObject#getJSONArray(String)} exception, return defaultValue</li> * <li>if {@link org.json.JSONArray#getString(int)} exception, return defaultValue</li> * <li>return string array</li> * </ul> */ public static List<String> getStringList(JSONObject jsonObject, String key, List<String> defaultValue) { if (jsonObject == null || StringUtils.isEmpty(key)) { return defaultValue; } try { JSONArray statusArray = jsonObject.getJSONArray(key); if (statusArray != null) { List<String> list = new ArrayList<String>(); for (int i = 0; i < statusArray.length(); i++) { list.add(statusArray.getString(i)); } return list; } } catch (JSONException e) { if (isPrintException) { e.printStackTrace(); } return defaultValue; } return defaultValue; } /** * get String list from jsonData * * @param jsonData * @param key * @param defaultValue * @return <ul> * <li>if jsonObject is null, return defaultValue</li> * <li>if jsonData {@link org.json.JSONObject#JSONObject(String)} exception, return defaultValue</li> * <li>return {@link cn.trinea.android.common.util.JSONUtils#getStringList(org.json.JSONObject, String, java.util.List)}</li> * </ul> */ public static List<String> getStringList(String jsonData, String key, List<String> defaultValue) { if (StringUtils.isEmpty(jsonData)) { return defaultValue; } try { JSONObject jsonObject = new JSONObject(jsonData); return getStringList(jsonObject, key, defaultValue); } catch (JSONException e) { if (isPrintException) { e.printStackTrace(); } return defaultValue; } } /** * get JSONObject from jsonObject * * @param jsonObject * @param key * @param defaultValue * @return <ul> * <li>if jsonObject is null, return defaultValue</li> * <li>if key is null or empty, return defaultValue</li> * <li>if {@link org.json.JSONObject#getJSONObject(String)} exception, return defaultValue</li> * <li>return {@link org.json.JSONObject#getJSONObject(String)}</li> * </ul> */ public static JSONObject getJSONObject(JSONObject jsonObject, String key, JSONObject defaultValue) { if (jsonObject == null || StringUtils.isEmpty(key)) { return defaultValue; } try { return jsonObject.getJSONObject(key); } catch (JSONException e) { if (isPrintException) { e.printStackTrace(); } return defaultValue; } } /** * get JSONObject from jsonData * * @param jsonData * @param key * @param defaultValue * @return <ul> * <li>if jsonData is null, return defaultValue</li> * <li>if jsonData {@link org.json.JSONObject#JSONObject(String)} exception, return defaultValue</li> * <li>return {@link cn.trinea.android.common.util.JSONUtils#getJSONObject(org.json.JSONObject, String, org.json.JSONObject)}</li> * </ul> */ public static JSONObject getJSONObject(String jsonData, String key, JSONObject defaultValue) { if (StringUtils.isEmpty(jsonData)) { return defaultValue; } try { JSONObject jsonObject = new JSONObject(jsonData); return getJSONObject(jsonObject, key, defaultValue); } catch (JSONException e) { if (isPrintException) { e.printStackTrace(); } return defaultValue; } } /** * get JSONObject from jsonObject * * @param jsonObject * @param defaultValue * @param keyArray * @return <ul> * <li>if jsonObject is null, return defaultValue</li> * <li>if keyArray is null or empty, return defaultValue</li> * <li>get {@link #getJSONObject(org.json.JSONObject, String, org.json.JSONObject)} by recursion, return it. if anyone is * null, return directly</li> * </ul> */ public static JSONObject getJSONObjectCascade(JSONObject jsonObject, JSONObject defaultValue, String... keyArray) { if (jsonObject == null || ArrayUtils.isEmpty(keyArray)) { return defaultValue; } JSONObject js = jsonObject; for (String key : keyArray) { js = getJSONObject(js, key, defaultValue); if (js == null) { return defaultValue; } } return js; } /** * get JSONObject from jsonData * * @param jsonData * @param defaultValue * @param keyArray * @return <ul> * <li>if jsonData is null, return defaultValue</li> * <li>if keyArray is null or empty, return defaultValue</li> * <li>get {@link #getJSONObject(org.json.JSONObject, String, org.json.JSONObject)} by recursion, return it. if anyone is * null, return directly</li> * </ul> */ public static JSONObject getJSONObjectCascade(String jsonData, JSONObject defaultValue, String... keyArray) { if (StringUtils.isEmpty(jsonData)) { return defaultValue; } try { JSONObject jsonObject = new JSONObject(jsonData); return getJSONObjectCascade(jsonObject, defaultValue, keyArray); } catch (JSONException e) { if (isPrintException) { e.printStackTrace(); } return defaultValue; } } /** * get JSONArray from jsonObject * * @param jsonObject * @param key * @param defaultValue * @return <ul> * <li>if jsonObject is null, return defaultValue</li> * <li>if key is null or empty, return defaultValue</li> * <li>if {@link org.json.JSONObject#getJSONArray(String)} exception, return defaultValue</li> * <li>return {@link org.json.JSONObject#getJSONArray(String)}</li> * </ul> */ public static JSONArray getJSONArray(JSONObject jsonObject, String key, JSONArray defaultValue) { if (jsonObject == null || StringUtils.isEmpty(key)) { return defaultValue; } try { return jsonObject.getJSONArray(key); } catch (JSONException e) { if (isPrintException) { e.printStackTrace(); } return defaultValue; } } /** * get JSONArray from jsonData * * @param jsonData * @param key * @param defaultValue * @return <ul> * <li>if jsonObject is null, return defaultValue</li> * <li>if jsonData {@link org.json.JSONObject#JSONObject(String)} exception, return defaultValue</li> * <li>return {@link cn.trinea.android.common.util.JSONUtils#getJSONArray(org.json.JSONObject, String, org.json.JSONObject)}</li> * </ul> */ public static JSONArray getJSONArray(String jsonData, String key, JSONArray defaultValue) { if (StringUtils.isEmpty(jsonData)) { return defaultValue; } try { JSONObject jsonObject = new JSONObject(jsonData); return getJSONArray(jsonObject, key, defaultValue); } catch (JSONException e) { if (isPrintException) { e.printStackTrace(); } return defaultValue; } } /** * get Boolean from jsonObject * * @param jsonObject * @param key * @param defaultValue * @return <ul> * <li>if jsonObject is null, return defaultValue</li> * <li>if key is null or empty, return defaultValue</li> * <li>return {@link org.json.JSONObject#getBoolean(String)}</li> * </ul> */ public static boolean getBoolean(JSONObject jsonObject, String key, Boolean defaultValue) { if (jsonObject == null || StringUtils.isEmpty(key)) { return defaultValue; } try { return jsonObject.getBoolean(key); } catch (JSONException e) { if (isPrintException) { e.printStackTrace(); } return defaultValue; } } /** * get Boolean from jsonData * * @param jsonData * @param key * @param defaultValue * @return <ul> * <li>if jsonObject is null, return defaultValue</li> * <li>if jsonData {@link org.json.JSONObject#JSONObject(String)} exception, return defaultValue</li> * <li>return {@link cn.trinea.android.common.util.JSONUtils#getBoolean(org.json.JSONObject, String, Boolean)}</li> * </ul> */ public static boolean getBoolean(String jsonData, String key, Boolean defaultValue) { if (StringUtils.isEmpty(jsonData)) { return defaultValue; } try { JSONObject jsonObject = new JSONObject(jsonData); return getBoolean(jsonObject, key, defaultValue); } catch (JSONException e) { if (isPrintException) { e.printStackTrace(); } return defaultValue; } } /** * get map from jsonObject. * * @param jsonObject key-value pairs json * @param key * @return <ul> * <li>if jsonObject is null, return null</li> * <li>return {@link cn.trinea.android.common.util.JSONUtils#parseKeyAndValueToMap(String)}</li> * </ul> */ public static Map<String, String> getMap(JSONObject jsonObject, String key) { return JSONUtils.parseKeyAndValueToMap(JSONUtils.getString(jsonObject, key, null)); } /** * get map from jsonData. * * @param jsonData key-value pairs string * @param key * @return <ul> * <li>if jsonData is null, return null</li> * <li>if jsonData length is 0, return empty map</li> * <li>if jsonData {@link org.json.JSONObject#JSONObject(String)} exception, return null</li> * <li>return {@link cn.trinea.android.common.util.JSONUtils#getMap(org.json.JSONObject, String)}</li> * </ul> */ public static Map<String, String> getMap(String jsonData, String key) { if (jsonData == null) { return null; } if (jsonData.length() == 0) { return new HashMap<String, String>(); } try { JSONObject jsonObject = new JSONObject(jsonData); return getMap(jsonObject, key); } catch (JSONException e) { if (isPrintException) { e.printStackTrace(); } return null; } } /** * parse key-value pairs to map. ignore empty key, if getValue exception, put empty value * * @param sourceObj key-value pairs json * @return <ul> * <li>if sourceObj is null, return null</li> * <li>else parse entry by {@link cn.trinea.android.common.util.MapUtils#putMapNotEmptyKey(java.util.Map, String, String)} one by one</li> * </ul> */ @SuppressWarnings("rawtypes") public static Map<String, String> parseKeyAndValueToMap(JSONObject sourceObj) { if (sourceObj == null) { return null; } Map<String, String> keyAndValueMap = new HashMap<String, String>(); for (Iterator iter = sourceObj.keys(); iter.hasNext();) { String key = (String)iter.next(); MapUtils.putMapNotEmptyKey(keyAndValueMap, key, getString(sourceObj, key, "")); } return keyAndValueMap; } /** * parse key-value pairs to map. ignore empty key, if getValue exception, put empty value * * @param source key-value pairs json * @return <ul> * <li>if source is null or source's length is 0, return empty map</li> * <li>if source {@link org.json.JSONObject#JSONObject(String)} exception, return null</li> * <li>return {@link cn.trinea.android.common.util.JSONUtils#parseKeyAndValueToMap(org.json.JSONObject)}</li> * </ul> */ public static Map<String, String> parseKeyAndValueToMap(String source) { if (StringUtils.isEmpty(source)) { return null; } try { JSONObject jsonObject = new JSONObject(source); return parseKeyAndValueToMap(jsonObject); } catch (JSONException e) { if (isPrintException) { e.printStackTrace(); } return null; } } }