package com.android.example;
import java.lang.reflect.Array;
import java.lang.reflect.Field;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
public class MyJSONParser {
public static Object populateObjectFromJSON(Class<?> classname, JSONObject js) {
Object obj = null;
System.out.println("Populating " + classname.getSimpleName()+ " -with- " + js.toString());
try {
obj = classname.newInstance();
} catch (InstantiationException e1) {
System.err.println(e1.getMessage());
return null;
} catch (IllegalAccessException e1) {
System.err.println(e1.getMessage());
return null;
}
Field[] fields = classname.getFields();
for (Field f : fields) {
try {
if (js.has(f.getName())) {
String type = f.getType().getSimpleName();
if (type.equalsIgnoreCase("boolean")) {
f.setBoolean(obj, js.getBoolean(f.getName()));
} else if (type.equalsIgnoreCase("int")) {
f.setInt(obj, js.getInt(f.getName()));
} else if (type.equalsIgnoreCase("double")) {
f.setDouble(obj, js.getDouble(f.getName()));
} else if (type.equalsIgnoreCase("float")) {
f.setFloat(obj, (float) js.getDouble(f.getName()));
} else if (type.equalsIgnoreCase("string")) {
f.set(obj, js.getString(f.getName()));
} else if (f.getType().isArray()) {
// System.out.println("This is an ARRAY: " + f.getName());
insertArrayFromJSON(obj, f, js.getJSONArray(f.getName()));
} else {
f.set(obj,populateObjectFromJSON(f.getType(),js.getJSONObject(f.getName())));
}
}
} catch (IllegalArgumentException e) {
System.err.println(e.getMessage());
} catch (IllegalAccessException e) {
System.err.println(e.getMessage());
} catch (JSONException e) {
System.err.println(e.getMessage());
}
}
return obj;
}
public static void insertArrayFromJSON(Object obj, Field f, JSONArray js, int pos) throws IllegalArgumentException, NegativeArraySizeException, IllegalAccessException, JSONException {
f.set(obj,Array.newInstance(f.getType().getComponentType(), js.length()));
String type = f.getType().getComponentType().getSimpleName();
for (int i = 0; i < js.length(); i++) {
if (f.getType().getComponentType().isArray()) {
System.out.println("An array!! " + f.getName());
//TO-DO
} else if (!f.getType().getComponentType().isPrimitive()&& (!type.equalsIgnoreCase("string"))) {
//System.out.println(f.getType().getSimpleName() + " isn't primitive " + f.getName());
Array.set(f.get(obj),i,populateObjectFromJSON(f.getType().getComponentType(),js.getJSONObject(i)));
//Array.set(f.get(obj),i,populateObjectFromJSON(f.getType().getComponentType(), new JSONObject(js.getJSONArray(i).toString())));
} else {
//Primitive
Array.set(f.get(obj), i, js.get(i));
}
}
}
public static JSONObject parseObjectToJSONClass(Object obj) {JSONObject js = new JSONObject();
Class<?> c = obj.getClass();
Field[] fields = c.getFields();
for (Field f : fields) {
try {
System.out.println(f.getName() + " - "+ f.getType().getSimpleName() + " - " + f.get(obj));
String name = f.getName();
String type = f.getType().getSimpleName();
if (f.get(obj) != null) {
if (type.equalsIgnoreCase("boolean")) {
js.put(name, f.getBoolean(obj));
} else if (type.equalsIgnoreCase("int")) {
js.put(name, f.getInt(obj));
} else if (type.equalsIgnoreCase("double")) {
js.put(name, f.getDouble(obj));
} else if (type.equalsIgnoreCase("float")) {
js.put(name, f.getFloat(obj));
} else if (type.equalsIgnoreCase("string")) {
js.put(name, (String) f.get(obj));
} else if (type.endsWith("]")) {
JSONArray ar = new JSONArray();
for (int i = 0; i < Array.getLength(f.get(obj)); i++) {
ar.put(i, Array.get(f.get(obj), i));
}
js.put(name, ar);
} else {
js.put(name, parseObjectToJSONClass(f.get(obj)));
}
}
} catch (IllegalArgumentException e) {
System.err.println(e.getMessage());
} catch (IllegalAccessException e) {
System.err.println(e.getMessage());
} catch (JSONException e) {
System.err.println(e.getMessage());
}
}
return js;
}
}