一、序言
JSON 数据的书写格式是:名称/值,因为json具有鲜明的格式,我们常用它来作为数据传输载体。我们在项目中经常会把从数据库得到的数据转成json格式传到前台,接收后进行解析,下面这个是我写的一个工具类,利用反射将对象中的属性,值 并转为json格式。
二、实现背景
在项目代码进行编写时,会经常使用json格式的数据进行数据传递,但是使用jsonArray的话都需要再重新转成string类型,如果需要大量的json数据的话会造成大量的资源浪费,因此编写了一个直接转换成string类型的json工具类。
三、实现方式
/** * @描述 将list数组转为json格式 * @param buffer * @param list * @return * @throws IllegalArgumentException * @throws IllegalAccessException */ private static StringBuffer listTojson(StringBuffer buffer,List list) throws IllegalArgumentException, IllegalAccessException{ //遍历传过来的list数组 for (Object object : list) { //判断遍历出的值是否为空 if (object == null) { buffer.append(","); } else{ Class<? extends Object> class1 = object.getClass(); String simpleName = class1.getSimpleName(); if(simpleName.equals("String")){ buffer.append("\""+object.toString()+"\","); } else if(simpleName.equals("Boolean")||simpleName.equals("Integer")||simpleName.equals("Double")||simpleName.equals("Float")||simpleName.equals("Long")){ buffer.append(""+object.toString()+","); } else if(simpleName.equals("Date")){ Date date = (Date) object; SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); String simdate = simpleDateFormat.format(date); buffer.append(""+simdate+","); } else{ Class<? extends Object> class2 = object.getClass(); Field[] fields = class2.getDeclaredFields(); Field.setAccessible(fields, true); buffer.append("{"); //遍历对象中的所有字段获取字段值和字段名称拼成json字符串 for (Field field : fields) { Object fieldobj = field.get(object); String fieldName = field.getType().getSimpleName(); if(fieldobj == null){ if(fieldName.equals("String")) { buffer.append("\""+field.getName()+"\":\"\","); } else{ buffer.append("\""+field.getName()+"\":null,"); } } else{ String fsimpleName = fieldobj.getClass().getSimpleName(); if(fsimpleName.equals("String")){ buffer.append("\""+field.getName()+"\":\""+field.get(object)+"\","); } else if(fsimpleName.equals("Boolean")||fsimpleName.equals("Integer")||fsimpleName.equals("Double")||fsimpleName.equals("Float")||fsimpleName.equals("Long")){ buffer.append("\""+field.getName()+"\":"+field.get(object)+","); } else if(fsimpleName.equals("Date")){ Date date = (Date) object; SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); String simdate = simpleDateFormat.format(date); buffer.append("\""+field.getName()+"\":"+simdate+","); } else{ buffer = beanTojson(fieldobj, buffer).append(","); } } } buffer = new StringBuffer(""+buffer.substring(0,buffer.length()-1)+""); buffer.append("},"); } } } buffer = new StringBuffer(""+buffer.substring(0,buffer.length()-1)+""); buffer.append("]"); return buffer; }
/** * @描述 将集合转为json格式的字符串 * @param obj * @return * @throws IllegalArgumentException * @throws IllegalAccessException */ private static String collectionTojson(Object obj) throws IllegalArgumentException, IllegalAccessException{ //定义一个StringBuffer类型的字符串 StringBuffer buffer = new StringBuffer(); buffer.append("["); Class<? extends Object> clazz = obj.getClass(); //获取类中所有的字段 Field[] declaredFields = clazz.getDeclaredFields(); //设置可以获得私有字段的value Field.setAccessible(declaredFields, true); //定义全局变量 boolean listf = false; boolean setf = false; Set<Object> set = null; List<Object> list = null; //遍历获取到的所有字段 for (Field field : declaredFields) { //getDeclaringClass()同getClasses(),但不局限于public修饰,只要是目标类中声明的内部类和接口均可 String simpleName = clazz.getSimpleName(); //判断获取到的类型 if(simpleName.equals("ArrayList")||simpleName.equals("LinkedList")){ list = (List<Object>) obj; listf=true; } if(simpleName.equals("HashSet")||simpleName.equals("TreeSet")){ set = (Set<Object>) obj; setf=true; } } //如果获取的对象类型为一个List集合 if(listf == true){ return listTojson(buffer, list).toString(); } //如果获取的对象类型为一个Set集合 if(setf == true){ buffer = setTojson(set, buffer); } buffer.append("]"); return buffer.toString(); }从中截取了两段,实现理念就是通过字符串拼接以及递归的方式,将全部的值获取到,并拼接成json字符串的样式,。
后面带有jar包以及源码,求大神指点