自己写的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
    }

}

 

posted @ 2012-04-12 14:21  如坐夕阳  Views(395)  Comments(0Edit  收藏  举报