• 自己写的Json类


    最近转Java,看了反射,然后写出了这个类。  此类可能不健全,需要学习的人可以看看,可以自己扩展。。仅供学习

    package com.qdu.util;
    
    import java.beans.BeanInfo;
    import java.beans.IntrospectionException;
    import java.beans.Introspector;
    import java.beans.PropertyDescriptor;
    import java.lang.reflect.Array;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
    
    /**
     * 自定义Json转换类 转换接口fromObject
     * 
     * @author yjq
     * 
     */
    public class JsonUtil {
        // public static void main(String[] argc) {
        // int[] intArray = new int[] { 1, 2, 3, 4 };
        // double[] doubleArray = new double[] { 1.0, 2.0, 3.0 };
        // LoginForm loginForm = new LoginForm();
        // loginForm.setUsername("刘易鑫");
        // loginForm.setPassword("adfasfdasd");
        // List<Object> strList = new ArrayList<Object>();
        // strList.add("1111111111111111");
        // strList.add("222222222222222222");
        // strList.add(new Date());
        // strList.add(loginForm);
        //
        // System.out.println(fromObject(intArray));
        // System.out.println(fromObject(doubleArray));
        // System.out.println(fromObject(loginForm));
        // System.out.println(fromObject(strList));
        // }
    
        /**
         * 把Object转为Json字符串
         * 
         * @param obj
         * @return
         */
        public static String fromObject(Object obj) {
            if (obj == null) {
                return null;
            }
            ArrayObjectType type = getObjectType(obj);
            if (obj.getClass().isArray()) {
                return fromArray(obj);
            }
            if (type == ArrayObjectType.R_List) {
                return fromList(obj);
            }
            if (type == ArrayObjectType.R_String) {// 字符串
                return "\"" + obj.toString() + "\"";
            }
            if (type == ArrayObjectType.R_Date) {
                return "\"" + obj.toString() + "\"";// 时间
            }
            if (type == ArrayObjectType.R_Value) {// 值类型
                return obj.toString();
            }
            return fromSingleObject(obj);
        }
    
        /**
         * 把一个简单类型的转
         * 
         * @return
         */
        private static String fromArray(Object arr) {
            StringBuilder sb = new StringBuilder();
            ArrayObjectType arrType = getObjectType(arr);
            sb.append("[");
            for (int i = 0; i < Array.getLength(arr); i++) {
                switch (arrType) {
                case v_boolean:
                    sb.append(Array.getBoolean(arr, i));
                    break;
                case v_char:
                    sb.append(Array.getChar(arr, i));
                    break;
                case v_int:
                    sb.append(Array.getInt(arr, i));
                    break;
                case v_byte:
                    sb.append(Array.getByte(arr, i));
                    break;
                case v_double:
                    sb.append(Array.getDouble(arr, i));
                    break;
                case v_long:
                    sb.append(Array.getLong(arr, i));
                    break;
                case v_short:
                    sb.append(Array.getShort(arr, i));
                    break;
                default:
                    sb.append(fromSingleObject(Array.get(arr, i)));
                }
                if (i != Array.getLength(arr) - 1)
                    sb.append(",");
            }
            sb.append("]");
            return sb.toString();
        }
    
        /**
         * 把 List转为Json字符串
         * 
         * @param list
         * @return
         */
        private static String fromList(Object obj) {
            StringBuilder sb = new StringBuilder();
            sb.append("[");
            List<?> list = (List<?>) obj;
            for (int i = 0; i < list.size(); i++) {
                String itemJson = fromObject(list.get(i));
                if (itemJson == null)
                    continue;
                sb.append(itemJson);
                if (i != list.size() - 1) {
                    sb.append(",");
                }
            }
            sb.append("]");
            return sb.toString();
        }
    
        /**
         * 单一的Object转成Json字符串 非简单类型,Date等类型
         * 
         * @param obj
         * @return
         */
        private static String fromSingleObject(Object obj) {
            StringBuilder sb = new StringBuilder();
            sb.append("{");
            try {
                BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());
                for (int i = 0; i < beanInfo.getPropertyDescriptors().length; i++) {
                    PropertyDescriptor prop = beanInfo.getPropertyDescriptors()[i];
                    String proName = prop.getName();
                    if (proName.equals("class"))
                        continue;
                    String itemjson = "";
                    try {
                        if (prop.getReadMethod() == null) {
                            continue;
                        }
                        Object propVaule = prop.getReadMethod().invoke(obj);
                        itemjson = fromObject(propVaule);
                        if (itemjson == null) {// json规定String为空的返回“”,数组为空的返回[],其它不表示
                            if (prop.getPropertyType().equals(String.class)) {
                                itemjson = "";
                            } else if (prop.getClass().isArray()) {
                                itemjson = "[]";
                            }
                        }
                        if (itemjson != null) {
                            sb.append(String.format("\"%s\":%s", proName, itemjson));
                            if (i != beanInfo.getPropertyDescriptors().length - 1)
                                sb.append(",");
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                        continue;
                    }
                }
            } catch (IntrospectionException e) {
                e.printStackTrace();
            }
    
            sb.append("}");
            return sb.toString();
        }
    
        /**
         * 得到数据类型
         * 
         * @param arr
         * @return
         */
        private static ArrayObjectType getObjectType(Object arr) {
            String type = "";
            if (arr == null)
                return ArrayObjectType.NULL;
            if (arr.getClass().isArray())
                type = arr.getClass().getComponentType().toString();
            else
                type = arr.getClass().toString();
    
            if (type.equals("string") || equalClassAndString(String.class, type)) {
                return ArrayObjectType.R_String;
            }
            if (type.equals("int")) {
                return ArrayObjectType.v_int;
            }
            if (type.equals("float")) {
                return ArrayObjectType.v_float;
            }
            if (type.equals("double")) {
                return ArrayObjectType.v_double;
            }
            if (type.equals("byte")) {
                return ArrayObjectType.v_byte;
            }
            if (type.equals("short")) {
                return ArrayObjectType.v_short;
            }
            if (type.equals("int")) {
                return ArrayObjectType.v_int;
            }
            if (type.equals("boolean")) {
                return ArrayObjectType.v_boolean;
            }
            if (type.equals("char")) {
                return ArrayObjectType.v_char;
            }
            if (type.equals(Date.class.toString())) {
                return ArrayObjectType.R_Date;
            }
            if (equalClassAndString(ArrayList.class, type)) {
                return ArrayObjectType.R_List;
            }
    
            if (equalClassAndString(Integer.class, type)
                    || equalClassAndString(Float.class, type)
                    || equalClassAndString(Double.class, type)
                    || equalClassAndString(Byte.class, type)
                    || equalClassAndString(Short.class, type)
                    || equalClassAndString(Long.class, type)) {
                return ArrayObjectType.R_Value;
            }
            return ArrayObjectType.R_Obj;
        }
    
        /**
         * 对比class是否是type
         * 
         * @param cls
         * @param type
         * @return
         */
        private static Boolean equalClassAndString(Class<?> cls, String type) {
            return cls.toString().equals(type);
        }
    
        /**
         * 数组元素的类型或对象的类型
         * 
         * @author yjq
         * 
         */
        enum ArrayObjectType {
            NULL, R_Obj, R_String, R_Value, R_Date, R_List, v_byte, v_char, v_double, v_int, v_short, v_long, v_boolean, v_float
        }
    
    }
  • 相关阅读:
    MyBatis 3源码分析
    Java动态代理
    HashMap原理分析(JDK1.7.x之前)
    JQuery datepicker 用法
    百度一键分享功能
    JQuery BlockUI插件
    AJAX参数详解
    ECharts图标库
    KeCode对照表(键盘按键的获取)
    常见浏览器兼容问题
  • 原文地址:https://www.cnblogs.com/yixinliu/p/2443927.html
Copyright © 2020-2023  润新知