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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  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 getInstance(Class clazz) throws Exception {
  116. if (clazz == List.class) {
  117. return new Vector<>();
  118. }
  119. if (clazz == AbstractMap.class) {
  120. return new HashMap<>();
  121. }
  122. return clazz.newInstance();
  123. }
  124. public void fromJson(JSONObject json) throws Exception
  125. {
  126. for (Field field : getClass().getDeclaredFields()) {
  127. String key = getJsonFromField(field.getName());
  128. Class clazz = field.getType();
  129. Object value = null;
  130. if (json.has(key)) {
  131. if (List.class.isAssignableFrom(clazz)) {
  132. ParameterizedType parameterizedType = (ParameterizedType) field.getGenericType();
  133. Class type = (Class) parameterizedType.getActualTypeArguments()[0];
  134. List<Object> list = (List<Object>) getInstance(clazz);
  135. JSONArray jsonArray = json.getJSONArray(key);
  136. for (int i = 0; i < jsonArray.length(); ++i) {
  137. list.add(getObjectFromJson(type, jsonArray, i));
  138. }
  139. value = list;
  140. }
  141. else if (clazz.isArray()) {
  142. Class type = clazz.getComponentType();
  143. JSONArray jsonArray = json.getJSONArray(key);
  144. Object array = Array.newInstance(type, jsonArray.length());
  145. for (int i = 0; i < jsonArray.length(); ++i) {
  146. Array.set(array, i, getObjectFromJson(type, jsonArray, i));
  147. }
  148. value = array;
  149. }
  150. else if (AbstractMap.class.isAssignableFrom(clazz)) {
  151. ParameterizedType parameterizedType = (ParameterizedType) field.getGenericType();
  152. Class type = (Class) parameterizedType.getActualTypeArguments()[0];
  153. if (type == String.class) {
  154. type = (Class) parameterizedType.getActualTypeArguments()[1];
  155. AbstractMap<String, Object> map = (AbstractMap<String, Object>) getInstance(clazz);
  156. JSONObject obj = json.getJSONObject(key);
  157. Iterator<String> it = obj.keys();
  158. while (it.hasNext()) {
  159. String k = it.next();
  160. map.put(k, getObjectFromJson(type, obj, k));
  161. }
  162. value = map;
  163. }
  164. }
  165. else {
  166. value = getObjectFromJson(clazz, json, key);
  167. }
  168. }
  169. field.setAccessible(true);
  170. field.set(this, value);
  171. field.setAccessible(false);
  172. }
  173. }
  174. public HashMap<String, Object> toArray()
  175. {
  176. HashMap<String, Object> map = new HashMap<>();
  177. for (Field field : getClass().getDeclaredFields()) {
  178. String key = getJsonFromField(field.getName());
  179. Class clazz = field.getType();
  180. }
  181. return map;
  182. }
  183. public JSONObject toJson()
  184. {
  185. return new JSONObject(toArray());
  186. }
  187. @Override
  188. public String toString()
  189. {
  190. return toJson().toString();
  191. }
  192. }