You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

LuDbo.java 7.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. package com.luticate.utils.dbo;
  2. import com.luticate.utils.dbo.JSONContainer.LuAbstractJsonContainer;
  3. import com.luticate.utils.dbo.JSONContainer.LuJSONArrayContainer;
  4. import com.luticate.utils.dbo.JSONContainer.LuJSONObjectContainer;
  5. import org.json.JSONArray;
  6. import org.json.JSONObject;
  7. import java.lang.reflect.Array;
  8. import java.lang.reflect.Field;
  9. import java.lang.reflect.ParameterizedType;
  10. import java.util.AbstractMap;
  11. import java.util.HashMap;
  12. import java.util.Iterator;
  13. import java.util.List;
  14. import java.util.Vector;
  15. /**
  16. * Created by robin on 11/27/15.
  17. */
  18. public abstract class LuDbo {
  19. public void fromString(String data) throws Exception
  20. {
  21. JSONObject json = new JSONObject(data);
  22. fromJson(json);
  23. }
  24. public String getFieldFromJson(String jsonName)
  25. {
  26. if (!jsonName.startsWith("_")) {
  27. return String.format("_%s", jsonName);
  28. }
  29. return jsonName;
  30. }
  31. public String getJsonFromField(String fieldName)
  32. {
  33. if (fieldName.startsWith("_")) {
  34. return fieldName.substring(1);
  35. }
  36. return fieldName;
  37. }
  38. public Object getObjectFromJson(Class clazz, LuAbstractJsonContainer json, Object key) throws Exception {
  39. if (json.isNull(key)) {
  40. return null;
  41. }
  42. if (clazz == Byte.class || clazz == byte.class) {
  43. return (byte) json.getInt(key);
  44. }
  45. if (clazz == Character.class || clazz == char.class) {
  46. return json.getString(key).charAt(0);
  47. }
  48. if (clazz == Short.class || clazz == short.class) {
  49. return (short) json.getInt(key);
  50. }
  51. if (clazz == Integer.class || clazz == int.class) {
  52. return json.getInt(key);
  53. }
  54. if (clazz == Long.class || clazz == long.class) {
  55. return json.getLong(key);
  56. }
  57. if (clazz == Float.class || clazz == float.class) {
  58. return (float) json.getDouble(key);
  59. }
  60. if (clazz == Double.class || clazz == double.class) {
  61. return json.getDouble(key);
  62. }
  63. if (clazz == Boolean.class || clazz == boolean.class) {
  64. return json.getBoolean(key);
  65. }
  66. if (clazz == String.class) {
  67. return json.getString(key);
  68. }
  69. if (LuDbo.class.isAssignableFrom(clazz)) {
  70. LuDbo dbo = (LuDbo) getInstance(clazz);
  71. dbo.fromJson(json.getJSONObject(key));
  72. return dbo;
  73. }
  74. return null;
  75. }
  76. public Object getJsonFromObject(Class clazz, Object obj)
  77. {
  78. if (obj == null) {
  79. return null;
  80. }
  81. if (clazz == char.class || clazz == Character.class) {
  82. return obj.toString();
  83. }
  84. if (clazz.isPrimitive() || clazz == Byte.class || clazz == Character.class
  85. || clazz == Short.class || clazz == Integer.class || clazz == Long.class
  86. || clazz == Float.class || clazz == Double.class || clazz == Boolean.class
  87. || clazz == String.class) {
  88. return obj;
  89. }
  90. if (LuDbo.class.isAssignableFrom(clazz)) {
  91. return ((LuDbo)obj).toArray();
  92. }
  93. if (List.class.isAssignableFrom(clazz)) {
  94. List objList = (List) obj;
  95. List list = new Vector();
  96. for (Object item : objList) {
  97. list.add(getJsonFromObject(getClazz(item), item));
  98. }
  99. return list;
  100. }
  101. if (AbstractMap.class.isAssignableFrom(clazz)) {
  102. HashMap objMap = (HashMap) obj;
  103. HashMap map = new HashMap();
  104. for (Object k : objMap.keySet()) {
  105. if (k.getClass() == String.class) {
  106. Object item = objMap.get(k);
  107. map.put(k, getJsonFromObject(getClazz(item), item));
  108. }
  109. }
  110. return map;
  111. }
  112. if (clazz.isArray()) {
  113. List list = new Vector();
  114. for (int i = 0; i < Array.getLength(obj); ++i) {
  115. Object item = Array.get(obj, i);
  116. list.add(getJsonFromObject(item == null ? null : item.getClass(), item));
  117. }
  118. return list;
  119. }
  120. return null;
  121. }
  122. public Object getInstance(Class clazz) throws Exception {
  123. if (clazz == List.class) {
  124. return new Vector<>();
  125. }
  126. if (clazz == AbstractMap.class) {
  127. return new HashMap<>();
  128. }
  129. return clazz.newInstance();
  130. }
  131. public Class getClazz(Object obj)
  132. {
  133. return obj == null ? null : obj.getClass();
  134. }
  135. public void fromJson(JSONObject json) throws Exception
  136. {
  137. for (Field field : getClass().getDeclaredFields()) {
  138. String key = getJsonFromField(field.getName());
  139. Class clazz = field.getType();
  140. if (json.has(key)) {
  141. Object value = null;
  142. if (List.class.isAssignableFrom(clazz)) {
  143. ParameterizedType parameterizedType = (ParameterizedType) field.getGenericType();
  144. Class type = (Class) parameterizedType.getActualTypeArguments()[0];
  145. List<Object> list = (List<Object>) getInstance(clazz);
  146. JSONArray jsonArray = json.getJSONArray(key);
  147. for (int i = 0; i < jsonArray.length(); ++i) {
  148. list.add(getObjectFromJson(type, new LuJSONArrayContainer(jsonArray), i));
  149. }
  150. value = list;
  151. }
  152. else if (clazz.isArray()) {
  153. Class type = clazz.getComponentType();
  154. JSONArray jsonArray = json.getJSONArray(key);
  155. Object array = Array.newInstance(type, jsonArray.length());
  156. for (int i = 0; i < jsonArray.length(); ++i) {
  157. Array.set(array, i, getObjectFromJson(type, new LuJSONArrayContainer(jsonArray), i));
  158. }
  159. value = array;
  160. }
  161. else if (AbstractMap.class.isAssignableFrom(clazz)) {
  162. ParameterizedType parameterizedType = (ParameterizedType) field.getGenericType();
  163. Class type = (Class) parameterizedType.getActualTypeArguments()[0];
  164. if (type == String.class) {
  165. type = (Class) parameterizedType.getActualTypeArguments()[1];
  166. AbstractMap<String, Object> map = (AbstractMap<String, Object>) getInstance(clazz);
  167. JSONObject obj = json.getJSONObject(key);
  168. Iterator<String> it = obj.keys();
  169. while (it.hasNext()) {
  170. String k = it.next();
  171. map.put(k, getObjectFromJson(type, new LuJSONObjectContainer(obj), k));
  172. }
  173. value = map;
  174. }
  175. }
  176. else {
  177. value = getObjectFromJson(clazz, new LuJSONObjectContainer(json), key);
  178. }
  179. field.setAccessible(true);
  180. field.set(this, value);
  181. field.setAccessible(false);
  182. }
  183. }
  184. }
  185. public HashMap<String, Object> toArray()
  186. {
  187. HashMap<String, Object> map = new HashMap<>();
  188. for (Field field : getClass().getDeclaredFields()) {
  189. String key = getJsonFromField(field.getName());
  190. Class clazz = field.getType();
  191. field.setAccessible(true);
  192. Object obj = null;
  193. try {
  194. obj = field.get(this);
  195. } catch (IllegalAccessException e) {
  196. e.printStackTrace();
  197. }
  198. field.setAccessible(false);
  199. map.put(key, getJsonFromObject(clazz, obj));
  200. }
  201. return map;
  202. }
  203. public JSONObject toJson()
  204. {
  205. return new JSONObject(toArray());
  206. }
  207. @Override
  208. public String toString()
  209. {
  210. return toJson().toString();
  211. }
  212. }