java-利用反射做一个将javabean对象转为json字符串的小工具(v1)
解决思路
1 利用反射机制获取对象的所有字段
2 遍历,将字段名和值按照一定格式添加到字符串中
所需知识
1 反射基础知识
代码实现
package com.woniu.ClassDemoHomeWork;
import java.lang.reflect.Field;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import com.woniu.ClassDemo.Student;
public class JsonConversion {
//确定基本类型数组,将其存入集合,便于后续使用
private static List<Class> TYPE_LIST=Arrays.asList(byte.class,short.class,int.class,long.class,boolean.class,float.class,double.class);
/*
* 创建对象转化json字符串的方法
*/
public static String parse(Object object) {
//创建字符串缓冲
StringBuilder jsonBuilder=new StringBuilder();
//添加大括号
jsonBuilder.append("{");
//反射
Class objectClass = object.getClass();
//获取所有字段
Field[] fields = objectClass.getDeclaredFields();
//循环遍历所有字段,进行封装
for(Field field:fields) {
//设置可以被访问
field.setAccessible(true);
//获取neme
String name = field.getName();
//添加到容器
jsonBuilder.append("\""+name+"\":");
//获取值
Object value =null;
try {
value = field.get(object);
} catch (IllegalArgumentException | IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//获取数据的类型
Class type = field.getType();
String jsonValue = getValue(type,value);
//调用方法,将值转为字符串
jsonBuilder.append(jsonValue);
jsonBuilder.append(",");
}
//删除最后一个,
jsonBuilder.deleteCharAt(jsonBuilder.length()-1);
//添加后括号
jsonBuilder.append("}");
return jsonBuilder.toString();
}
/*
* 创建判断传入的字段的类型,并返回拼接好的字符串的方法
*/
private static String getValue(Class type, Object value) {
//是字符串和字符型
if(type==String.class||type==char.class) {
return "\""+value+"\"";
}else if (Number.class.isAssignableFrom(type)||Boolean.class==type||TYPE_LIST.contains(type)) {
//是包装类和基本类型
return value.toString();
}else if (Collection.class.isAssignableFrom(type)) {
//集合类型
//创建容器
StringBuilder valueBuilder=new StringBuilder();
valueBuilder.append("[");
//强转
Collection collection=(Collection)value;
//循环遍历
for(Object obj:collection) {
//递归调用方法,循环判断数据类型
String string = getValue(obj.getClass(), obj);
valueBuilder.append(string);
valueBuilder.append(",");
}
//删除最后一个逗号
valueBuilder.deleteCharAt(valueBuilder.length()-1);
valueBuilder.append("]");
//返回字符串
return valueBuilder.toString();
}else if (Date.class==type) {
//是时间类型
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return "\""+sdf.format(value)+"\"";
}else {
//复合类型,递归调用
return parse(value);
}
}
public static void main(String[] args) {
Student student=new Student(0, "张三","女",500.0,new Date());
String string = parse(student);
System.out.println(string);
}
}
验证:
1 main方法结果为
{“id”:0,“sName”:“张三”,“sSex”:“女”,“sHeight”:500.0,“sBirthday”:“2019-09-28 19:19:51”}
2 利用kjson.com网站验证
小结
基本类型 包装类 date类 collection集合类的字段以及基于以上类型的对象可以转化,其他类型就不可以了.