package com.luticate.utils.dbo; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.lang.reflect.Array; import java.lang.reflect.Field; import java.lang.reflect.GenericArrayType; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.AbstractMap; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Objects; import java.util.Vector; /** * Created by robin on 11/27/15. */ public abstract class LuDbo { public void fromString(String data) throws Exception { JSONObject json = new JSONObject(data); fromJson(json); } public String getFieldFromJson(String jsonName) { if (!jsonName.startsWith("_")) { return String.format("_%s", jsonName); } return jsonName; } public String getJsonFromField(String fieldName) { if (fieldName.startsWith("_")) { return fieldName.substring(1); } return fieldName; } public Object getObjectFromJson(Class clazz, JSONObject json, String key) throws Exception { if (json.isNull(key)) { return null; } if (clazz == Byte.class || clazz == byte.class) { return (byte) json.getInt(key); } if (clazz == Character.class || clazz == char.class) { return json.getString(key).charAt(0); } if (clazz == Short.class || clazz == short.class) { return (short) json.getInt(key); } if (clazz == Integer.class || clazz == int.class) { return json.getInt(key); } if (clazz == Long.class || clazz == long.class) { return json.getLong(key); } if (clazz == Float.class || clazz == float.class) { return (float) json.getDouble(key); } if (clazz == Double.class || clazz == double.class) { return json.getDouble(key); } if (clazz == Boolean.class || clazz == boolean.class) { return json.getBoolean(key); } if (clazz == String.class) { return json.getString(key); } if (LuDbo.class.isAssignableFrom(clazz)) { LuDbo dbo = (LuDbo) getInstance(clazz); dbo.fromJson(json.getJSONObject(key)); return dbo; } return null; } public Object getObjectFromJson(Class clazz, JSONArray json, int key) throws Exception { if (json.isNull(key)) { return null; } if (clazz == Byte.class || clazz == byte.class) { return (byte) json.getInt(key); } if (clazz == Character.class || clazz == char.class) { return json.getString(key).charAt(0); } if (clazz == Short.class || clazz == short.class) { return (short) json.getInt(key); } if (clazz == Integer.class || clazz == int.class) { return json.getInt(key); } if (clazz == Long.class || clazz == long.class) { return json.getLong(key); } if (clazz == Float.class || clazz == float.class) { return (float) json.getDouble(key); } if (clazz == Double.class || clazz == double.class) { return json.getDouble(key); } if (clazz == Boolean.class || clazz == boolean.class) { return json.getBoolean(key); } if (clazz == String.class) { return json.getString(key); } if (LuDbo.class.isAssignableFrom(clazz)) { LuDbo dbo = (LuDbo) getInstance(clazz); dbo.fromJson(json.getJSONObject(key)); return dbo; } return null; } public Object getInstance(Class clazz) throws Exception { if (clazz == List.class) { return new Vector<>(); } if (clazz == AbstractMap.class) { return new HashMap<>(); } return clazz.newInstance(); } public void fromJson(JSONObject json) throws Exception { for (Field field : getClass().getDeclaredFields()) { String key = getJsonFromField(field.getName()); Class clazz = field.getType(); Object value = null; if (json.has(key)) { if (List.class.isAssignableFrom(clazz)) { ParameterizedType parameterizedType = (ParameterizedType) field.getGenericType(); Class type = (Class) parameterizedType.getActualTypeArguments()[0]; List list = (List) getInstance(clazz); JSONArray jsonArray = json.getJSONArray(key); for (int i = 0; i < jsonArray.length(); ++i) { list.add(getObjectFromJson(type, jsonArray, i)); } value = list; } else if (clazz.isArray()) { Class type = clazz.getComponentType(); JSONArray jsonArray = json.getJSONArray(key); Object array = Array.newInstance(type, jsonArray.length()); for (int i = 0; i < jsonArray.length(); ++i) { Array.set(array, i, getObjectFromJson(type, jsonArray, i)); } value = array; } else if (AbstractMap.class.isAssignableFrom(clazz)) { ParameterizedType parameterizedType = (ParameterizedType) field.getGenericType(); Class type = (Class) parameterizedType.getActualTypeArguments()[0]; if (type == String.class) { type = (Class) parameterizedType.getActualTypeArguments()[1]; AbstractMap map = (AbstractMap) getInstance(clazz); JSONObject obj = json.getJSONObject(key); Iterator it = obj.keys(); while (it.hasNext()) { String k = it.next(); map.put(k, getObjectFromJson(type, obj, k)); } value = map; } } else { value = getObjectFromJson(clazz, json, key); } } field.setAccessible(true); field.set(this, value); field.setAccessible(false); } } public HashMap toArray() { HashMap map = new HashMap<>(); for (Field field : getClass().getDeclaredFields()) { String key = getJsonFromField(field.getName()); Class clazz = field.getType(); } return map; } public JSONObject toJson() { return new JSONObject(toArray()); } @Override public String toString() { return toJson().toString(); } }