反射实现对象转json格式字符串

一、序言
             JSON 数据的书写格式是:名称/值,因为json具有鲜明的格式,我们常用它来作为数据传输载体。我们在项目中经常会把从数据库得到的数据转成json格式传到前台,接收后进行解析,下面这个是我写的一个工具类,利用反射将对象中的属性,值 并转为json格式。
二、工具类
   
package test;
import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map.Entry;
import java.util.Set;
import java.lang.reflect.Field;
import java.util.Map;




public class JsonUtils {
 
 /**
  * @param obj
  * @return
  * @throws InstantiationException
  * @throws IllegalAccessException
  */
 public static String getJsonString(Object obj) throws InstantiationException, IllegalAccessException  {
  
  //如果传入的对象为集合
  if (obj instanceof Collection) {
   
   //执行collectionTojson方法将集合类型转为json格式
   return collectionTojson(obj);
   
  }
  
  //如果获取的对象类型为一个Map集合
  else if (obj instanceof Map) {
   
   //执行mapTojson方法将Map类型转为json格式
   return mapTojson(obj);
  
  }
  
  //如果获取的对象类型为普通对象
  else{
   
   //执行classTojson方法将普通类型转为json格式
   return classTojson(obj);
   
  }  
 }
   
 /**
  * @描述 将集合转为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格式
  * @param obj
  * @return
  */
 private static String classTojson(Object obj){
  
  //通过反射获取到类
  Class<? extends Object> clazz = obj.getClass();
  
  //获取类中所有的字段
  Field[] fields = clazz.getDeclaredFields();
  
  StringBuffer buffer = new StringBuffer();
  buffer.append("[{");
  
  //设置setAccessible方法能获取到类中的私有属性和方法
  Field.setAccessible(fields, true);
  
  //遍历所有的方法和属性
  for (Field field : fields) {
   
   try {
    
    Object object = field.get(obj);
    
    //获取到该属性对应类型名称
    String fieldName = field.getType().getSimpleName();
    
    //如果该属性的值为空
    if(object == null){
     
     //根据类型判断追加的值
     if(fieldName.equals("String"))
     {
      buffer.append("\""+field.getName()+"\":\"\",");
     }
     else if(fieldName.equals("Boolean")||fieldName.equals("Integer")||fieldName.equals("Double")||fieldName.equals("Float")||fieldName.equals("Long")){
      
      buffer.append("\""+field.getName()+"\":0,");
     }
    
     else{
      buffer.append("\""+field.getName()+"\":null,");
     }
     
    }
    else{
     
     //获取到该属性的值对应的类
     Class<? extends Object> fieldclass = object.getClass();
     String simpleName = fieldclass.getSimpleName();
    
    if(simpleName.equals("String")){
     
     buffer.append("\""+field.getName()+"\":\""+field.get(obj)+"\",");
    
    }
    else if(simpleName.equals("Boolean")||simpleName.equals("Integer")||simpleName.equals("Double")||simpleName.equals("Float")||simpleName.equals("Long")){
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值