一、序言
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包以及源码,求大神指点