package com.android.reverse.util;
import java.lang.reflect.Field;
import java.util.Collection;
import java.util.Map;
import org.json.JSONArray;
import org.json.JSONObject;
public class JsonWriter {
public static String parserInstanceToJson(Object data) throws Exception {
if (data.getClass().isPrimitive() || isSimpleType(data)) {
return data.toString();
}
JSONObject result = new JSONObject();
Field[] fields = data.getClass().getDeclaredFields();
Field field = null;
for (int i = 0; i < fields.length; i++) {
field = fields[i];
field.setAccessible(true);
Object value = field.get(data);
if (field.getType().isPrimitive()) {
result.put(field.getName(), value);
} else {
if (isSimpleType(value)) {
result.put(field.getName(), value);
} else if (value == null) {
result.put(field.getName(), null);
} else if (isSimpleTypeArray(value)) {
JSONArray arrayData = new JSONArray();
Object[] objArray = (Object[]) value;
if (objArray != null) {
for (int j = 0; j < objArray.length; j++) {
arrayData.put(objArray[j]);
}
}
result.put(field.getName(), arrayData);
} else if (value instanceof Object[]) {
JSONArray arrayData = new JSONArray();
Object[] objArray = (Object[]) value;
for (int j = 0; j < objArray.length; j++) {
arrayData.put(parserInstanceToJson(objArray[j]));
}
result.put(field.getName(), arrayData);
} else if (value instanceof Collection) {
JSONArray arrayData = new JSONArray();
Object[] objArray = ((Collection) value).toArray();
for (int j = 0; j < objArray.length; j++) {
if (isSimpleType(objArray[j]))
arrayData.put(objArray[j]);
else
arrayData.put(parserInstanceToJson(objArray[j]));
}
result.put(field.getName(), arrayData);
} else if (value instanceof Map) {
JSONArray arrayData = new JSONArray();
Map map = (Map) value;
Object[] keyArray = map.keySet().toArray();
for (int j = 0; j < keyArray.length; j++) {
JSONObject obj = new JSONObject();
obj.put("key", parserInstanceToJson(keyArray[j]));
obj.put("value", parserInstanceToJson(map.get(keyArray[j])));
arrayData.put(obj);
}
result.put(field.getName(), arrayData);
}
else if (value instanceof Object) {
result.put(field.getName(), parserInstanceToJson(value));
} else {
Logger.log("the field:" + field.getName() + " can't covert to json");
}
}
}
return result.toString();
}
private static boolean isSimpleType(Object obj) {
if (obj instanceof Integer || obj instanceof Long || obj instanceof Double || obj instanceof Float || obj instanceof Byte
|| obj instanceof Short || obj instanceof Character || obj instanceof Boolean || obj instanceof String) {
return true;
}
return false;
}
private static boolean isSimpleTypeArray(Object obj) {
if (obj instanceof Integer[] || obj instanceof Long[] || obj instanceof Double[] || obj instanceof Float[] || obj instanceof Byte[]
|| obj instanceof Short[] || obj instanceof Character[] || obj instanceof Boolean[] || obj instanceof String[]) {
return true;
}
return false;
}
}