// Based on https://gist.github.com/codebutler/2339666 // Copyright (c) 2014 VK.com // // Permission is hereby granted, free of charge, to any person obtaining a copy of // this software and associated documentation files (the "Software"), to deal in // the Software without restriction, including without limitation the rights to // use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of // the Software, and to permit persons to whom the Software is furnished to do so, // subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS // FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR // COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER // IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN // CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // package com.vk.sdk.util; import com.vk.sdk.VKSdk; import com.vk.sdk.api.model.VKApiModel; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.lang.reflect.Array; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; /** * Provide common functions for json processing */ @SuppressWarnings("rawtypes") public class VKJsonHelper { /** * Converts object to JSON object, if possible * * @param object object to serialize to json * @return Completed json object * @throws JSONException */ public static Object toJSON(Object object) throws JSONException { if (object instanceof Map) { JSONObject json = new JSONObject(); Map map = (Map) object; for (Object key : map.keySet()) { json.put(key.toString(), toJSON(map.get(key))); } return json; } else if (object instanceof Iterable) { JSONArray json = new JSONArray(); for (Object value : ((Iterable) object)) { json.put(value); } return json; } else { return object; } } /** * Check if json object is empty * * @param object object to check * @return true if object is empty */ public static boolean isEmptyObject(JSONObject object) { return object.names() == null; } /** * Converts field in key to map * * @param object target object * @param key target key * @return Map of field by passed key * @throws JSONException */ public static Map<String, Object> getMap(JSONObject object, String key) throws JSONException { return toMap(object.getJSONObject(key)); } /** * Converts selected json-object to map * * @param object object to convert * @return Filled map * @throws JSONException */ public static Map<String, Object> toMap(JSONObject object) throws JSONException { Map<String, Object> map = new HashMap<String, Object>(); Iterator keys = object.keys(); while (keys.hasNext()) { String key = (String) keys.next(); map.put(key, fromJson(object.get(key))); } return map; } /** * Converts json-array to list * * @param array json-array to convert * @return converted array * @throws JSONException */ @SuppressWarnings("unchecked") public static List toList(JSONArray array) throws JSONException { List list = new ArrayList(); for (int i = 0; i < array.length(); i++) { list.add(fromJson(array.get(i))); } return list; } public static Object toArray(JSONArray array, Class arrayClass) { Object ret = Array.newInstance(arrayClass.getComponentType(), array.length()); Class<?> subType = arrayClass.getComponentType(); for (int i = 0; i < array.length(); i++) { try { Object jsonItem = array.get(i); Object objItem = subType.newInstance(); if (jsonItem instanceof JSONObject) { JSONObject jsonItem2 = (JSONObject) jsonItem; if (objItem instanceof VKApiModel) { VKApiModel objItem2 = (VKApiModel) objItem; ((VKApiModel) objItem).parse(jsonItem2); Array.set(ret, i, objItem2); } } } catch (JSONException e) { if (VKSdk.DEBUG) e.printStackTrace(); } catch (InstantiationException e) { if (VKSdk.DEBUG) e.printStackTrace(); } catch (IllegalAccessException e) { if (VKSdk.DEBUG) e.printStackTrace(); } } return ret; } /** * Converts object from json to java object * * @param json object from jsonobject or jsonarray * @return converted object * @throws JSONException */ private static Object fromJson(Object json) throws JSONException { if (json == JSONObject.NULL) { return null; } else if (json instanceof JSONObject) { return toMap((JSONObject) json); } else if (json instanceof JSONArray) { return toList((JSONArray) json); } else { return json; } } }