java-利用反射做一个将javabean对象转为json的小工具(v1)

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集合类的字段以及基于以上类型的对象可以转化,其他类型就不可以了.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值