blob: bb59833b29fe41fac101f1ab640d0cbd8a6214b7 [file] [log] [blame]
package io.flutter.plugin.common;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.json.JSONArray;
import org.json.JSONObject;
public class JSONUtil {
private JSONUtil() {}
/**
* Convert the Json java representation to Java objects. Particularly used for converting
* JSONArray and JSONObject to Lists and Maps.
*/
public static Object unwrap(Object o) {
if (JSONObject.NULL.equals(o) || o == null) {
return null;
}
if (o instanceof Boolean
|| o instanceof Byte
|| o instanceof Character
|| o instanceof Double
|| o instanceof Float
|| o instanceof Integer
|| o instanceof Long
|| o instanceof Short
|| o instanceof String) {
return o;
}
try {
if (o instanceof JSONArray) {
List<Object> list = new ArrayList<>();
JSONArray array = (JSONArray) o;
for (int i = 0; i < array.length(); i++) {
list.add(unwrap(array.get(i)));
}
return list;
}
if (o instanceof JSONObject) {
Map<String, Object> map = new HashMap<>();
JSONObject jsonObject = (JSONObject) o;
Iterator<String> keyIterator = jsonObject.keys();
while (keyIterator.hasNext()) {
String key = keyIterator.next();
map.put(key, unwrap(jsonObject.get(key)));
}
return map;
}
} catch (Exception ignored) {
}
return null;
}
/** Backport of {@link JSONObject#wrap(Object)} for use on pre-KitKat systems. */
public static Object wrap(Object o) {
if (o == null) {
return JSONObject.NULL;
}
if (o instanceof JSONArray || o instanceof JSONObject) {
return o;
}
if (o.equals(JSONObject.NULL)) {
return o;
}
try {
if (o instanceof Collection) {
JSONArray result = new JSONArray();
for (Object e : (Collection) o) result.put(wrap(e));
return result;
} else if (o.getClass().isArray()) {
JSONArray result = new JSONArray();
int length = Array.getLength(o);
for (int i = 0; i < length; i++) result.put(wrap(Array.get(o, i)));
return result;
}
if (o instanceof Map) {
JSONObject result = new JSONObject();
for (Map.Entry<?, ?> entry : ((Map<?, ?>) o).entrySet())
result.put((String) entry.getKey(), wrap(entry.getValue()));
return result;
}
if (o instanceof Boolean
|| o instanceof Byte
|| o instanceof Character
|| o instanceof Double
|| o instanceof Float
|| o instanceof Integer
|| o instanceof Long
|| o instanceof Short
|| o instanceof String) {
return o;
}
if (o.getClass().getPackage().getName().startsWith("java.")) {
return o.toString();
}
} catch (Exception ignored) {
}
return null;
}
}