定义vo类和JSON转换工具类

  • 通过JSON自动的处理机制需要进行多层VO对象的取得,这样的做法在实际工作中比较麻烦,也不建议使用,所以此时如果是一个单独的VO对象则可以自己编写一个程序类.
  • 定义BO与JSON的转换处理
package mao.shu.util;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;

/**
 * 将普通java类对象的成员和成员变量转换为JSON格式的数据
 * @write Maoshu
 * @date 2019年1月11日10:50:38
 */
public class VoToJSONUtil {
    /**
     * 将一个对象中的成员变量数据,自动拼接位为JSON格式数据,但只会读取第一层的数据<br/>
     * 如果该对象中还含有其他对象的引用,则不会继续读取<br/>
     *
     *      {"变量名称1":变量内容1,"变量名称2":变量内容2,...}   <br/>
     *
     * 该方法使用StringBuffer类完成拼接操作,<br>
     * 1.    先通过反射取出该对象的每一个成员<br/>
     * 2.    再调用本类中isBasicData()判断每一个成员变量是否为常用的数据类型<br/>
     * 3.    再使用本类中的handle()方法,将变量和变量内容转换为 "变量名称1":变量内容1 的格式
     * * @param obj
     * @return
     * @throws Exception
     */
    public static String createJSONdate(Object obj)throws Exception{
        //拼接vo类中的成员变量,和变量内容
        //JSON中每一组数据都是以"{"开始
        StringBuffer buf = new StringBuffer("{");
        //首先的到vo类中所有的成员
        Field[] fields = obj.getClass().getDeclaredFields();
        for(int x = 0; x < fields.length; x++){
            //得到每一个成员变量的类型
            String fieldTypeName = fields[x].getType().getSimpleName();
          //判断如果该成员变量为基本数据类型,则进行拼接操作
            if(isBasicData(fieldTypeName) != -1){
                //如果是基本数据类型的话,那就将变量名和变量内容以"变量名:变量值"的格式返回
                String key_value = handle(obj,fields[x]);
                //拼接到buf字符串中
                buf.append(key_value).append(",");
            }
        }
        //去除掉最后一个","号,再最后添加上"}"号
        buf.delete(buf.length()-1,buf.length()).append("}");
        return buf.toString();
    }

    /**
     * 将指定对象中的成员变量以"变量名:变量内容"的格式返回
     * @param obj 要操作的对象
     * @param field 类中的一个成员
     * @return
     *          "变量名:变量内容",如果变量内容为字符串型或是日期类型则要使用双引号包裹字符串<br/>
     * 例如:<br/>
     *      "变量名:"变量内容""
     */
    private static String handle(Object obj,Field field) throws Exception {
        //保存变量类型名称
        String fieldTypeName = field.getType().getSimpleName();
        //得到变量名称
        String fieldName = field.getName();
        //得到成员变量的get()方法
        Method method = obj.getClass().getMethod("get"+StringUtil.initCap(fieldName));
        //保存方法执行的结果
        Object value = method.invoke(obj);

        //判断变量类型为那种数据类型,int返回1,double返回2,String返回4,Date返回8
        int typeNumber = isBasicData(fieldTypeName);
        //如果为int或者double类型,则变量内容不用添加双引号
        if(typeNumber == 1 | typeNumber == 2){
            return "\""+fieldName+"\""+":"+value;
        }else if (typeNumber == 4){
            return "\""+fieldName+"\""+":"+"\""+value+"\"";
        }else if (typeNumber == 8){
            SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            String date = sf.format(value);
            return "\""+fieldName+"\""+":"+"\""+date+"\"";
        }
        //如果是其他类型,则不进行处理
        return "";
    }

    /**
     * 判断为那种基本数据类型的方法,该方法有以下几种返回值<br/>
     * 如果是double类型返回 1 <br/>
     * 如果是int类型返回 2;<br/>
     * 如果是String类型返回 4<br/>
     * 如果是Date类型返回 8 <br/>
     * @param dataTypeName :
     *                     变量的类型简写名称
     * @return
     */
    private static Integer isBasicData(String dataTypeName){
        if(dataTypeName .equalsIgnoreCase("double")){
            return 1;
        }else if(dataTypeName.equals("int")||dataTypeName.equals("Integer")){
            return 2;
        }else if(dataTypeName.equals("String")){
            return 4;
        }else if(dataTypeName.equals("Date")){
            return 8;
        }
        return -1;
    }
}

  • 首字母大写工具类
package mao.shu.util;

public class StringUtil {
    /**
     * 将原字符串str的首字母大写处理
     * @param str 原字符串
     * @return 首字母大写的字符串
     */
    public static String initCap(String str){
        return str.substring(0,1).toUpperCase()+str.substring(1);
    }
}

  • 测试数据

package mao.shu.jsondemo;

import mao.shu.util.VoToJSONUtil;
import mao.shu.vo.Dept;
import mao.shu.vo.Emp;


import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class json_demo4 {
    public static void main(String[] args)throws Exception {
        //保存三个雇员的信息
        int[] empno = new int[]{1,2,3};
        String[] ename = new String[]{"SMITH","jack","luse"};
        String[] job = new String[]{"maneager","employee","ceo"};

        //新增加一个部门
        Dept personnel = new Dept();
        personnel.setDeptno(1001);
        personnel.setDname("aiZhong");
        personnel.setLoc("中国");
        personnel.setSetupDate(new Date());

        List<Emp> allEmp = new ArrayList<>();
        for (int i = 0; i < empno.length; i++) {
            Emp vo = new Emp();
            vo.setEmpno(empno[i]);
            vo.setEname(ename[i]);
            vo.setJob(job[i]);
            vo.setDept(personnel);
            //一个雇员拥有一个部门
            allEmp.add(vo);
        }
        //一个部门拥有多个雇员
        personnel.setAllEmp(allEmp);
        String jsondata = VoToJSONUtil.createJSONdate(personnel);
        //输出部门信息
        System.out.println(jsondata);
    }
}

  • 测试结果

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_43386754/article/details/86291844