由于常规转json。只要model牵涉到复杂的关联实体对象。那么就会出现 深度循环的错误。

因此这里通过ConvertHelper.class来解决 深度循环的控制次数。

这个ConvertHelper.class也是同事网上找的,效率上可能慢了点。

但是一般转json,我的项目中都是为了存放到redis缓存的。所以之后也就不存在转换的情况了。

 

JsonConvert.class

  1. import java.util.List;
  2. import java.util.Map;
  3. import java.util.Set;
  4. import org.apache.log4j.Logger;
  5. import com.kintech.common.utils.log.LogerHelper;
  6. import org.codehaus.jackson.map.DeserializationConfig;
  7. import org.codehaus.jackson.map.ObjectMapper;
  8. import org.codehaus.jackson.map.SerializationConfig;
  9. import org.codehaus.jackson.type.JavaType;
  10. import org.codehaus.jackson.type.TypeReference;
  11. public class JsonConvert {
  12. private static final Logger logger = Logger.getLogger(JsonConvert.class);
  13. private static final ObjectMapper mapper = new ObjectMapper(); //转换器
  14. static{
  1. mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    mapper.configure(DeserializationConfig.Feature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT, true) ;
    mapper.disable(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS); //忽略映射属性
    mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
  1. }
  2. /**
  3. * java对象(包括list)转json
  4. * @throws Exception
  5. */
  6. public static String toJSON(Object object){
  7. try {
  8. return mapper.writeValueAsString(object);
  9. } catch (Exception e) {
  10. //e.printStackTrace();
  11. LogerHelper.WebLog(LogerHelper.getPrintStr(e));
  12. return null;
  13. }
  14. }
  15. /**
  16. * 针对hibernate关联model深度循环转json
  17. * @throws Exception
  18. */
  19. public static String toHJSON(Object object,int layer){
  20. try {
  21. if(object instanceof List){
  22. object = ConverHelper.getListCopy((List)object, layer);
  23. }else if(object instanceof Set){
  24. object = ConverHelper.getSetCopy((Set)object, layer);
  25. }else{
  26. object = ConverHelper.getCopy(layer,object);
  27. }
  28. return mapper.writeValueAsString(object);
  29. } catch (Exception e) {
  30. //e.printStackTrace();
  31. LogerHelper.WebLog(LogerHelper.getPrintStr(e));
  32. return null;
  33. }
  34. }
  35. /**
  36. * 针对hibernate关联model深度循环转json
  37. * @throws Exception
  38. */
  39. public static String toHJSON(Object object){
  40. try {
  41. if(object instanceof List){
  42. object = ConverHelper.getListCopy((List)object);
  43. }else if(object instanceof Set){
  44. object = ConverHelper.getSetCopy((Set)object);
  45. }else{
  46. object = ConverHelper.getCopy(object);
  47. }
  48. return mapper.writeValueAsString(object);
  49. } catch (Exception e) {
  50. //e.printStackTrace();
  51. LogerHelper.WebLog(LogerHelper.getPrintStr(e));
  52. return null;
  53. }
  54. }
  55. /**
  56. * json转java对象
  57. * @param json
  58. * @param cs
  59. * @throws Exception
  60. */
  61. public static <T> T fromJson(String json, Class<T> cs) {
  62. try {
  63. return mapper.readValue(json, cs);
  64. } catch (Exception e) {
  65. //e.printStackTrace();
  66. LogerHelper.WebLog(LogerHelper.getPrintStr(e));
  67. return null;
  68. }
  69. }
  70. /**
  71. * json转java对象(Model中含有List<T>)
  72. * 针对错误:java.util.LinkedHashMap cannot be cast to .....
  73. * @param json
  74. * @param cs
  75. * @throws Exception
  76. */
  77. public static <T> T fromJson(String json, TypeReference<T> cs) {
  78. try {
  79. return mapper.readValue(json, cs);
  80. } catch (Exception e) {
  81. //e.printStackTrace();
  82. throw new RuntimeException(MESSAGE);
  83. }
  84. }
  85. /**
  86. * json转map
  87. * @param json
  88. * @param cs
  89. * @return
  90. * @throws Exception
  91. */
  92. public static Map toMap(String json, Class<Map> cs) {
  93. try {
  94. return mapper.readValue(json, cs);
  95. } catch (Exception e) {
  96. //e.printStackTrace();
  97. LogerHelper.WebLog(LogerHelper.getPrintStr(e));
  98. return null;
  99. }
  100. }
  101. /**
  102. * json转list
  103. * @param json
  104. * @param beanClass
  105. * @return
  106. * @throws Exception
  107. */
  108. public static <T> List<T> jsonToList(String json, Class<T> beanClass) {
  109. try {
  110. return (List<T>) mapper.readValue(json, getCollectionType(List.class, beanClass));
  111. } catch (Exception e) {
  112. //e.printStackTrace();
  113. LogerHelper.WebLog(LogerHelper.getPrintStr(e));
  114. return null;
  115. }
  116. }
  117. public static JavaType getCollectionType(Class<?> collectionClass, Class<?> elementClasses) {
  118. return mapper.getTypeFactory().constructParametricType(collectionClass, elementClasses);
  119. }
  120. }

 

ConvertHelper(类名不要带 _

  1. package com.kps.common.utils;
  2. import java.io.ObjectInputStream.GetField;
  3. import java.lang.reflect.Field;
  4. import java.lang.reflect.Method;
  5. import java.sql.Timestamp;
  6. import java.util.ArrayList;
  7. import java.util.Arrays;
  8. import java.util.Date;
  9. import java.util.HashMap;
  10. import java.util.HashSet;
  11. import java.util.List;
  12. import java.util.Map;
  13. import java.util.Map.Entry;
  14. import java.util.Set;
  15. import org.apache.log4j.Logger;
  16. import org.hibernate.collection.internal.PersistentBag;
  17. import org.hibernate.collection.internal.PersistentMap;
  18. import org.hibernate.collection.internal.PersistentSet;
  19. import com.kps.model.SuperBaseModel;
  20. /**
  21. * 按层次copy hibernate对象
  22. *
  23. */
  24. @SuppressWarnings("all")
  25. public class ConverHelper{
  26. private static final Logger logger = Logger.getLogger(ConverHelper.class);
  27. private static String MESSAGE = "copy object error!";
  28. private static int LAYER =3;
  29. /**
  30. * 得到属性(包括父类)
  31. */
  32. private static List<Field> getFields(Class cs){
  33. List<Field> fieldList = new ArrayList<>() ;
  34. Class tempClass = cs;
  35. while (tempClass != null) {//当父类为null的时候说明到达了最上层的父类(Object类).
  36. fieldList.addAll(Arrays.asList(tempClass.getDeclaredFields()));
  37. tempClass = tempClass.getSuperclass(); //得到父类,然后赋给自己
  38. }
  39. return fieldList;
  40. }
  41. /**
  42. * 最核心的方法,用来解析hibernate model;
  43. * @param layer 解析深度
  44. * @param t 为hibernate model
  45. *
  46. */
  47. public static <T> T getCopy(T t,int...layers) {
  48. if (t == null) return null;
  49. if (t instanceof SuperBaseModel) { //如果为hibernate映射model
  50. int layer = LAYER;
  51. if (layers != null && layers.length > 0) {
  52. layer = layers[0];
  53. }
  54. if (layer > 0) {
  55. layer--;
  56. } else {
  57. return null;
  58. }
  59. try {
  60. Class<?> oClass = (Class<?>) t.getClass();
  61. String className = oClass.getName();
  62. // 通过观察发现代理对象(懒加载)和实体对象是有关联的
  63. // 规律大概是“类名_字符串”,这样可以通过传入对象取实体对象的类名(包括传入实体对象);
  64. // 懒加载为代理对象不让查询数据库
  65. if(className.indexOf("_")>=0) return null;
  66. String entityClassName = className.split("_")[0];
  67. Class entityClass = Class.forName(entityClassName);// 获取实体对象class实例
  68. Object newT = entityClass.newInstance();// 创建实体对象用于储存传入对象信息;
  69. List<Field> fields = getFields(entityClass);
  70. for (Field f : fields) { // 反射获取对象属性拼出get、set方法
  71. String fieldName = f.getName();
  72. if (fieldName.equalsIgnoreCase("serialVersionUID")) {
  73. continue;
  74. }
  75. String getMethodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
  76. String setMethodName = "set" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
  77. Method getMethod = oClass.getMethod(getMethodName);
  78. Object obj = getMethod.invoke(t);// 获取属性的值
  79. if (obj != null) {
  80. /*
  81. * System.out.println("转换"+obj);
  82. * System.out.println("转换"+obj.getClass());
  83. * System.out.println("转换"+ntClass);
  84. */
  85. /*
  86. * logger.info("转换" + obj); logger.info("转换" +
  87. * obj.getClass()); logger.info("转换" + ntClass);
  88. */
  89. // 通过观察发现代理对象(懒加载)和实体对象是有关联的
  90. // 规律大概是“类名_字符串”,这样可以通过传入对象取实体对象的类名(包括传入实体对象);
  91. String objClassName = obj.getClass().getName().split("_")[0];
  92. Class objClass = Class.forName(objClassName);
  93. if (objClass.isAssignableFrom(PersistentSet.class)||objClass.isAssignableFrom(HashSet.class))// 关联查询属性是set hibernate返回的是PersistentSet
  94. objClass = Set.class;
  95. else if (objClass.isAssignableFrom(PersistentBag.class)||objClass.isAssignableFrom(ArrayList.class))//关联查询属性是list hibernate返回的是PersistentBag
  96. objClass = List.class;
  97. else if (objClass.isAssignableFrom(PersistentMap.class)||objClass.isAssignableFrom(HashMap.class))//关联查询属性是Map hibernate返回的是PersistentMap
  98. objClass = Map.class;
  99. else if (objClass.isAssignableFrom(Timestamp.class))// 处理数据库取到时间的问题
  100. objClass = Date.class;
  101. Method setmethod = entityClass.getMethod(setMethodName, objClass);// 获取实体类中的set方法;
  102. if (obj instanceof Set) { //如果属于set调用getSetCopy方法
  103. Set<Object> set = (Set<Object>) obj;
  104. setmethod.invoke(newT, getSetCopy(set, layer));
  105. } else if (obj instanceof List) { //如果属于list调用getListCopy方法
  106. List<Object> list = (List<Object>) obj;
  107. setmethod.invoke(newT, getListCopy(list, layer));
  108. } else if (obj instanceof Map) { //如果属于map调用getMapCopy方法
  109. Map map = (Map)obj;
  110. setmethod.invoke(newT, getMapCopy(map, layer));
  111. }else {// 属于其他类型
  112. setmethod.invoke(newT, getCopy(obj, layer));
  113. }
  114. }
  115. }
  116. return (T) newT;
  117. } catch (Exception e) {
  118. logger.error(LogerHelper.getPrintStr(e));
  119. throw new RuntimeException(MESSAGE);
  120. }
  121. }else{
  122. return t;
  123. }
  124. }
  125. /**
  126. * @param layer
  127. * @param T 为hibernate model
  128. * @return
  129. */
  130. public static <T> Set<T> getSetCopy(Set<T> set, int...layers) {
  131. if(set==null) return null;
  132. int layer = LAYER;
  133. if(layers!=null&&layers.length>0){
  134. layer = layers[0];
  135. }
  136. // if (layer > 0) {
  137. // layer--;
  138. // } else {
  139. // return null;
  140. // }
  141. Set<T> newSet = new HashSet<T>();
  142. for (T obj : set) {
  143. newSet.add(getCopy(obj,layer));
  144. }
  145. return newSet;
  146. }
  147. /**
  148. * @param layer
  149. * @param T 为hibernate model
  150. */
  151. public static <T> List<T> getListCopy(List<T> list, int...layers) {
  152. if (list == null) return null;
  153. int layer = LAYER;
  154. if(layers!=null&&layers.length>0){
  155. layer = layers[0];
  156. }
  157. /* if (layer > 0) {
  158. layer--;
  159. } else {
  160. return null;
  161. }*/
  162. ArrayList<T> arrayList = new ArrayList<T>();
  163. for (T obj : list) {
  164. arrayList.add(getCopy(obj,layer));
  165. }
  166. return arrayList;
  167. }
  168. /**
  169. * @param layer
  170. * @param T 为hibernate model
  171. */
  172. public static <K,V> Map<K,V> getMapCopy(Map<K,V> map, int...layers) {
  173. if (map == null) return null;
  174. int layer = LAYER;
  175. if(layers!=null&&layers.length>0){
  176. layer = layers[0];
  177. }
  178. /* if (layer > 0) {
  179. layer--;
  180. } else {
  181. return null;
  182. }*/
  183. Map<K,V> rMap = new HashMap<K, V>();
  184. for (K key : map.keySet()) {
  185. rMap.put(key, getCopy(map.get(key),layer));
  186. }
  187. return rMap;
  188. }
  189. }

 

 

 

 

 

 

 

 

 

  1.  

版权声明:本文为hanjun0612原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/hanjun0612/p/9779781.html