123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209 |
- 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<Object> list = (List<Object>) 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<String, Object> map = (AbstractMap<String, Object>) getInstance(clazz);
- JSONObject obj = json.getJSONObject(key);
- Iterator<String> 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<String, Object> toArray()
- {
- HashMap<String, Object> 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();
- }
- }
|