java json转换
来源:互联网 发布:风管套料软件 编辑:程序博客网 时间:2024/06/06 17:01
主要使用了2个类 JsonConvert.class 和 ConvertHelper.class
由于常规转json。只要model牵涉到复杂的关联实体对象。那么就会出现 深度循环的错误。
因此这里通过ConvertHelper.class来解决 深度循环的控制次数。
这个ConvertHelper.class也是同事网上找的,效率上可能慢了点。
但是一般转json,我的项目中都是为了存放到redis缓存的。所以之后也就不存在转换的情况了。
JsonConvert.class
public class JsonConvert {private static final Logger logger = Logger.getLogger(JsonConvert.class);private static final ObjectMapper mapper = new ObjectMapper(); //转换器static{mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);mapper.disable(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS); //忽略映射属性}/** * java对象(包括list)转json * @throws Exception */public static String toJSON(Object object){try {return mapper.writeValueAsString(object);} catch (Exception e) {//e.printStackTrace();LogerHelper.WebLog(LogerHelper.getPrintStr(e));return null;}} /** * 针对hibernate关联model深度循环转json * @throws Exception */public static String toHJSON(Object object,int layer){try {if(object instanceof List){object = ConverHelper.getListCopy((List)object, layer);}else if(object instanceof Set){object = ConverHelper.getSetCopy((Set)object, layer);}else{object = ConverHelper.getCopy(layer,object);}return mapper.writeValueAsString(object);} catch (Exception e) {//e.printStackTrace();LogerHelper.WebLog(LogerHelper.getPrintStr(e));return null;}} /** * 针对hibernate关联model深度循环转json * @throws Exception */public static String toHJSON(Object object){try {if(object instanceof List){object = ConverHelper.getListCopy((List)object);}else if(object instanceof Set){object = ConverHelper.getSetCopy((Set)object);}else{object = ConverHelper.getCopy(object);}return mapper.writeValueAsString(object);} catch (Exception e) {//e.printStackTrace();LogerHelper.WebLog(LogerHelper.getPrintStr(e));return null;}} /** * json转java对象 * @param json * @param cs * @throws Exception */public static <T> T fromJson(String json, Class<T> cs) {try {return mapper.readValue(json, cs);} catch (Exception e) {//e.printStackTrace();LogerHelper.WebLog(LogerHelper.getPrintStr(e));return null;}}/** * json转map * @param json * @param cs * @return * @throws Exception */public static Map toMap(String json, Class<Map> cs) {try {return mapper.readValue(json, cs);} catch (Exception e) {//e.printStackTrace();LogerHelper.WebLog(LogerHelper.getPrintStr(e));return null;}}/** * json转list * @param json * @param beanClass * @return * @throws Exception */public static <T> List<T> jsonToList(String json, Class<T> beanClass) {try {return (List<T>) mapper.readValue(json, getCollectionType(List.class, beanClass));} catch (Exception e) {//e.printStackTrace();LogerHelper.WebLog(LogerHelper.getPrintStr(e));return null;}} public static JavaType getCollectionType(Class<?> collectionClass, Class<?> elementClasses) { return mapper.getTypeFactory().constructParametricType(collectionClass, elementClasses); } }
ConvertHelper
public class ConverHelper {private static final Logger logger = Logger.getLogger(ConverHelper.class);private static String MESSAGE = "copy object error!"; private static int LAYER =2;/** * 得到属性(包括父类) */private static List<Field> getFields(Class cs){List<Field> fieldList = new ArrayList<>() ;Class tempClass = cs;while (tempClass != null) {//当父类为null的时候说明到达了最上层的父类(Object类). fieldList.addAll(Arrays.asList(tempClass.getDeclaredFields())); tempClass = tempClass.getSuperclass(); //得到父类,然后赋给自己}return fieldList;} /** * @param layer 解析深度 * @param t 解析对象 * 最核心的方法,用来解析model; * */public static <T> T getCopy(T t,int...layers) {if (t == null) return null;if (t instanceof SuperBaseModel) {int layer = LAYER;if (layers != null && layers.length > 0) {layer = layers[0];}if (layer > 0) {layer--;} else {return null;}try {Class<?> otClass = (Class<?>) t.getClass();// 通过观察发现代理对象(懒加载)和实体对象是有关联的// 规律大概是“类名_字符串”,这样可以通过传入对象取实体对象的类名(包括传入实体对象);String ntClassName = otClass.getName().split("_")[0];Class ntClass = Class.forName(ntClassName);// 获取实体对象class实例Object newT = ntClass.newInstance();// 创建实体对象用于储存传入对象信息;List<Field> fields = getFields(ntClass);for (Field f : fields) { // 反射获取对象属性拼出get、set方法String fieldName = f.getName();if (fieldName.equalsIgnoreCase("serialVersionUID")) {continue;}String getMethodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);String setMethodName = "set" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);Method getMethod = otClass.getMethod(getMethodName);Object obj = getMethod.invoke(t);// 获取属性的值if (obj != null) {/* * System.out.println("转换"+obj); * System.out.println("转换"+obj.getClass()); * System.out.println("转换"+ntClass); *//* * logger.info("转换" + obj); logger.info("转换" + * obj.getClass()); logger.info("转换" + ntClass); */// 通过观察发现代理对象(懒加载)和实体对象是有关联的// 规律大概是“类名_字符串”,这样可以通过传入对象取实体对象的类名(包括传入实体对象);String objClassName = obj.getClass().getName().split("_")[0];Class objClass = Class.forName(objClassName);if (objClass.isAssignableFrom(PersistentSet.class))// 关联查询属性是set hibernate返回的是PersistentSetobjClass = Set.class;else if (objClass.isAssignableFrom(PersistentBag.class))//关联查询属性是list hibernate返回的是PersistentBagobjClass = List.class;else if (objClass.isAssignableFrom(Timestamp.class))// 处理数据库取到时间的问题objClass = Date.class;Method setmethod = ntClass.getMethod(setMethodName, objClass);// 获取实体类中的set方法;if (obj instanceof Set) {// 如果属于set调用setCopy方法Set<Object> set = (Set<Object>) obj;setmethod.invoke(newT, getSetCopy(set, layer));} else if (obj instanceof List) {// 如果属于list调用setCopy方法List<Object> list = (List<Object>) obj;setmethod.invoke(newT, getListCopy(list, layer));} else {// 属于其他类型setmethod.invoke(newT, getCopy(obj, layer));}}}return (T) newT;} catch (Exception e) {e.printStackTrace();LogerHelper.WebLog(LogerHelper.getPrintStr(e));throw new RuntimeException(MESSAGE);}}else{return t;}} /** * @param set * @param layer * @return */public static <T> Set<T> getSetCopy(Set<T> set, int...layers) {if(set==null) return null;int layer = LAYER; if(layers!=null&&layers.length>0){ layer = layers[0]; }// if (layer > 0) {//layer--;//} else {//return null;//}Set<T> newSet = new HashSet<T>();for (T obj : set) {newSet.add(getCopy(obj,layer));}return newSet;} /** * @param list * @param layer * 处理复制list类型对象; * 我们项目中使用的都是query.list()所以主要调用该方法处理list */public static <T> List<T> getListCopy(List<T> list, int...layers) {if (list == null) return null;int layer = LAYER; if(layers!=null&&layers.length>0){ layer = layers[0]; } /* if (layer > 0) {layer--;} else {return null;}*/ArrayList<T> arrayList = new ArrayList<T>();for (T obj : list) {arrayList.add(getCopy(obj,layer));}return arrayList;}}
阅读全文
0 0
- json--4.json转换java
- java json 类型转换
- java 转换xml json
- java json 转换
- java json转换
- Java Object, Json 转换
- java和json转换
- java json object 转换
- JAVA中json转换
- java转换json
- java json转换
- JSON --- JAVA对象转换为json
- JSON以及Java转换JSON的方法
- json-lib JSON与Java之间转换
- Java、Json转换方式之一:json-lib
- java json字符串转换成json对象
- json与java数据转换
- java json对象转换数组
- MacBook 電池壽命加倍延長超攻略:目標 2000 次電池循環
- 说说Spring MVC的工作原理、流程
- Java RMI 框架(远程方法调用)
- HUAWEI CE6870 IPv6 OSPFv3 配置
- luma3ds7.1按start键开机无法启动payload解决
- java json转换
- 高考那年: 擦肩而过的军校
- python将py编译成so方法
- 文件存储单位
- Eclipse背景颜色插件安装
- 关于开发工具Myeclipse2014中反编译软件Jadclipse的安装和运用
- 开始linux黑洞之旅
- next_permutation & prev_permutation
- Eclipase 反编译插件安装