package utils; import java.lang.reflect.Array; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collection; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; /** * * @author Administrator */ public class JSONUtil { /** * 字段过滤模式 */ public static final int INCLUDE = 0; public static final int REMOVE = 1; private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); /** * * @param <T> * @param o * @param maxLength 如果是String型,字符串的最大截取长度 * @param createSub 如果是集合,那么集合中的子对象是否也生成json字串 * @param Map<String, List<String&rt;&rt; filterMap :对指定的类进行字段的过滤 * @param pattern 字段过滤模式:0(NOT)-只考虑已经列出的字段,1(REMOVE)-去除已经列出的字段 * @return */ public static <T> String toJSON(T o, int maxLength, boolean createSub, Map<String, String> filterMap, int pattern) { if (o == null) { return "null"; } return toJSONx(o, o.getClass(), maxLength, createSub, filterMap, pattern, null); } public static <T> String toJSON(T o) { return JSONUtil.toJSON(o, 0, false, null, 0); } public static <T> String toJSON(T o, int maxLength) { return JSONUtil.toJSON(o, maxLength, false, null, 0); } /** * * @param <T> * @param o 要转为json的对象 * @param clazz o的类型,关键时刻,用于强制转换o的类型T为V * @param maxLength * @param createSub * @param filterMap * @param pattern * @param olist 存储已经处理过的对象,在list中的索引越高,层级越深 * @return */ private static <T> String toJSONx(T o, Class clazz, int maxLength, boolean createSub, Map<String, String> filterMap, int pattern, List<Object> olist) { String s = ""; String c = ""; try { if (o != null) { /** * 不知道是何种类型的,利用反射得到元素,但是防止循环引用,此处做一次检查, * 有个缺陷,如果元素对相同对象引用两次,则只会自动转为不考虑下级对象模式,防止死循环 */ olist = olist == null ? (new ArrayList<Object>()) : olist; for (Object vo : olist) { if (vo == o) { createSub = false; S.p("-----(toJSONx)已爬取过,再爬取一次, 但不再考虑下级"); break; } else { olist.add(o); } } c = o.getClass().getName(); //检查各种类型情况 if (String.class.getName().equals(c)) { return S.addDoubleQuot(maxLength > 0 ? S.left(o + "", maxLength) : (o + "")); } else if (o instanceof Number || Boolean.class.getName().equals(c) || boolean.class.getName().equals(c)) { return o + ""; } else if (o instanceof Date) { return S.addDoubleQuot(sdf.format((Date) o)); } else if (o instanceof Collection) { s += "["; int k = 0; for (Object oo : (Collection) o) { if (createSub) { if (k++ > 0) { s += ", "; } s += toJSONx(oo, oo.getClass(), maxLength, createSub, filterMap, pattern, olist); } else { s += getJsonString(oo, maxLength); } } s += "]"; } else if (Map.class.getName().equals(c) || HashMap.class.getName().equals(c)) { s += "{"; int k = 0; Map map = (HashMap