package icbc; import java.lang.reflect.Field; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import static jdk.nashorn.internal.runtime.regexp.joni.Config.DEBUG; /** * @Author: Alawn * @Description: * @Date: Create in 下午4:52 2021/3/5 */ public class BeanToJson { //需要解决的问题 //1.怎么获取字段名,怎么获取字段的值 //2.怎么判断是基本类型,基本类型的值,不需要加隐含 //3.怎么判断是常用的类型,如果是常用类型里面的集合话,需要递归判断 //4.如何判断是自定义的bean对象 如果是自定义的bean对象,需要再次进行解析, //5.数组的话,需要遍历展示 //6.将key按照ascii码升序排列 //修改部分:原文存在bug.当类型为数组类型的时候,会出现问题, 以修正为需要的逻辑 public static String toJson(T t) { if (t == null) { return "{}"; } return beanToJson(t); } public static String beanToJson(T t) { //先获取所有字段名 Field[] fields = t.getClass().getDeclaredFields(); String[] keys = new String[fields.length]; for (int i = 0; i < fields.length; i++) { keys[i] = fields[i].getName(); } //获取按照Ascii排序之后的顺序 keys = getUrlParam(keys); StringBuilder sb = new StringBuilder(); sb.append("{"); Map map = new HashMap<>(); for (int i = 0; i < keys.length; i++) { for (Field field : fields) { if (field.getName().equals(keys[i])) { map.put(keys[i], field); // 当方法名满足键值得时候结束当前层循环 continue; } } } for (String name : keys) { Field field = map.get(name); field.setAccessible(true); Class type = field.getType(); Object value = null; try { value = field.get(t); } catch (IllegalAccessException e) { e.printStackTrace(); } // 内部类的外部类引用(指针)字段 if (name.contains("this$")) { continue; } String typeName = type.getName(); if (typeName.equals("java.lang.String")) { try { sb.append("\"" + name + "\":"); sb.append(stringToJson((String) field.get(t))); sb.append(","); } catch (Exception e) { if (DEBUG) { e.printStackTrace(); } } } else if (typeName.equals("boolean") || typeName.equals("java.lang.Boolean") || typeName.equals("int") || typeName.equals("java.lang.Integer") || typeName.equals("float") || typeName.equals("java.lang.Float") || typeName.equals("double") || typeName.equals("java.lang.Double") || typeName.equals("long") || typeName.equals("java.lang.Long")) { try { sb.append("\"" + name + "\":"); sb.append(field.get(t)); sb.append(","); } catch (Exception e) { if (DEBUG) { e.printStackTrace(); } } } else if (typeName.equals("java.util.List") || typeName.equals("java.util.ArrayList")) { try { List objList = (List) field.get(t); if (null != objList && objList.size() > 0) { sb.append("\"" + name + "\":"); sb.append("["); String toJson = listToJson((List) field.get(t)); sb.append(toJson); sb.setCharAt(sb.length() - 1, ']'); sb.append(","); } } catch (Exception e) { if (DEBUG) { e.printStackTrace(); } } } else if (value.getClass().isArray()) { Object[] arr = (Object[]) value; // 装换成数组 List list = Arrays.asList(arr); try { if (null != list && list.size() > 0) { sb.append("\"" + name + "\":"); sb.append("["); String toJson = listToJson(list); sb.append(toJson); sb.setCharAt(sb.length() - 1, ']'); sb.append(","); } } catch (Exception e) { if (DEBUG) { e.printStackTrace(); } } } else { try { sb.append("\"" + name + "\":"); sb.append("{"); sb.append(beanToJson(field.get(t))); sb.setCharAt(sb.length() - 1, '}'); sb.append(","); } catch (Exception e) { if (DEBUG) { e.printStackTrace(); } } } } if (sb.length() == 1) { sb.append("}"); } sb.setCharAt(sb.length() - 1, '}'); return sb.toString(); } /** * 将 List 对象编码为 JSON格式 * * @param objList 待封装的对象集合 * @return String:封装后JSONArray String格式 * @version 1.0 */ private static String listToJson(List objList) { final StringBuilder sb = new StringBuilder(); for (T t : objList) { if (t instanceof String) { sb.append(stringToJson((String) t)); sb.append(","); } else if (t instanceof Boolean || t instanceof Integer || t instanceof Float || t instanceof Double) { sb.append(t); sb.append(","); } else { sb.append(beanToJson(t)); sb.append(","); } } return sb.toString(); } /** * 将 String 对象编码为 JSON格式,只需处理好特殊字符 * * @param str String 对象 * @return String:JSON格式 * @version 1.0 */ private static String stringToJson(final String str) { if (str == null || str.length() == 0) { return "\"\""; } final StringBuilder sb = new StringBuilder(); sb.append('\"'); for (int i = 0; i < str.length(); i++) { final char c = str.charAt(i); sb.append(c == '\"' ? "\\\"" : c == '\\' ? "\\\\" : c == '/' ? "\\/" : c == '\b' ? "\\b" : c == '\f' ? "\\f" : c == '\n' ? "\\n" : c == '\r' ? "\\r" : c == '\t' ? "\\t" : c + ""); } sb.append('\"'); return sb.toString(); } /** * 对字符串数组进行排序 * * @param keys * @return */ private static String[] getUrlParam(String[] keys) { for (int i = 0; i < keys.length - 1; i++) { for (int j = 0; j < keys.length - i - 1; j++) { String pre = keys[j]; String next = keys[j + 1]; if (isMoreThan(pre, next)) { String temp = pre; keys[j] = next; keys[j + 1] = temp; } } } return keys; } /** * 比较两个字符串的大小,按字母的ASCII码比较 * * @param pre * @param next * @return */ private static boolean isMoreThan(String pre, String next) { if (null == pre || null == next || "".equals(pre) || "".equals(next)) { return false; } char[] c_pre = pre.toCharArray(); char[] c_next = next.toCharArray(); int minSize = Math.min(c_pre.length, c_next.length); for (int i = 0; i < minSize; i++) { if ((int) c_pre[i] > (int) c_next[i]) { return true; } else if ((int) c_pre[i] < (int) c_next[i]) { return false; } } if (c_pre.length > c_next.length) { return true; } return false; } }