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 9.0KB

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