275 lines
9.5 KiB
Java
275 lines
9.5 KiB
Java
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 <T> String toJson(T t) {
|
|
if (t == null) {
|
|
return "{}";
|
|
}
|
|
return beanToJson(t);
|
|
}
|
|
|
|
public static <T> 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<String, Field> 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 <T> String listToJson(List<T> 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;
|
|
}
|
|
|
|
}
|