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