如题,该工具通过反射实现对象转json字符串,可以按照对象属性首字母(首字母相同则依次向后比对)进行顺序或逆序排序,代码如下
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Date;
import java.util.List;
/**
* @description:
* @author: 王泽龙
* @create: 2019-07-24 16:12
**/
public class CommonUtils {
/**
* @Description: 支持类型String, int, Integer, long, Long, Double, float, Boolean, boolean, Date
* ,默认正序(小的在前面,a在前面),rule=1则正序,rule=-1则逆序
* @Param: [o]
* @return: java.lang.String
* @Author: 王泽龙
* @Date: 2019/7/24
* @Time: 16:30
*/
public static String obj2JSONStr(Object o) throws Exception {
return trans(o,1);
}
/**
* @Description: 支持类型String, int, Integer, long, Long, Double, float, Boolean, boolean, Date, List
* ,默认正序(小的在前面,a在前面),rule=1则正序,rule=-1则逆序
* @Param: [o]
* @return: java.lang.String
* @Author: 王泽龙
* @Date: 2019/7/24
* @Time: 16:30
*/
public static String obj2JSONStr(Object o,int rule) throws Exception {
return trans(o,rule);
}
private static String trans(Object o,int rule) throws Exception{
if(o==null)return null;
Class<?> clz = o.getClass();
//获取该类所有的属性
Field[] fields = clz.getDeclaredFields();
StringBuilder sb = new StringBuilder();
String r="";
sb.append("{");
sort(fields,rule);
for(Field field : fields){
if(field.getName().equals("serialVersionUID"))continue;
if(field.getGenericType().toString().equals("class java.lang.String")){
//如果是字符串类型
Method m = clz.getMethod("get" + getMethodName(field.getName()));
String val = (String)m.invoke(o);
if(val!=null){
sb.append("\""+field.getName()+"\":\""+val+"\",");
} else {
sb.append("\""+field.getName()+"\":null,");
}
} else if(field.getGenericType().toString().equals("class java.lang.Integer")){
//如果是整型类型
Method m = clz.getMethod("get" + getMethodName(field.getName()));
Integer val = (Integer)m.invoke(o);
if(val!=null){
sb.append("\""+field.getName()+"\":"+val+",");
} else {
sb.append("\""+field.getName()+"\":null,");
}
} else if(field.getGenericType().toString().equals("int")){
//如果是int类型
Method m = clz.getMethod("get" + getMethodName(field.getName()));
int val = (int)m.invoke(o);
sb.append("\""+field.getName()+"\":"+val+",");
} else if(field.getGenericType().toString().equals("class java.lang.Double")){
//如果是double,float类型
Method m = clz.getMethod("get" + getMethodName(field.getName()));
Double val = (Double)m.invoke(o);
if(val!=null){
sb.append("\""+field.getName()+"\":"+val+",");
} else {
sb.append("\""+field.getName()+"\":null,");
}
} else if(field.getGenericType().toString().equals("float")){
//如果是float类型
Method m = clz.getMethod("get" + getMethodName(field.getName()));
float val = (float)m.invoke(o);
sb.append("\""+field.getName()+"\":"+val+",");
}else if(field.getGenericType().toString().equals("class java.lang.Boolean")){
//如果是Boolean类型
Method m = clz.getMethod("get" + getMethodName(field.getName()));
Boolean val = (Boolean)m.invoke(o);
if(val!=null){
sb.append("\""+field.getName()+"\":"+val+",");
} else {
sb.append("\""+field.getName()+"\":null,");
}
} else if(field.getGenericType().toString().equals("boolean")){
//如果是boolean类型
Method m = clz.getMethod("is" +getMethodName(field.getName()));
Boolean val = (Boolean)m.invoke(o);
if(val!=null){
sb.append("\""+field.getName()+"\":"+val+",");
} else {
sb.append("\""+field.getName()+"\":null,");
}
} else if(field.getGenericType().toString().equals("class java.lang.Long") || field.getGenericType().toString().equals("long")){
//如果是Long,long类型
Method m = clz.getMethod("get" + getMethodName(field.getName()));
Long val = (Long)m.invoke(o);
if(val!=null){
sb.append("\""+field.getName()+"\":"+val+",");
} else {
sb.append("\""+field.getName()+"\":null,");
}
} else if(field.getGenericType().toString().equals("class java.util.Date")){
//如果是Date类型
Method m = clz.getMethod("get" +getMethodName(field.getName()));
Date val = (Date)m.invoke(o);
if(val!=null){
sb.append("\""+field.getName()+"\":\""+val+"\",");
} else {
sb.append("\""+field.getName()+"\":null,");
}
} else if(field.getGenericType().toString().equals("class java.util.List")){
Method m = clz.getMethod("get" +getMethodName(field.getName()));
List val = (List)m.invoke(o);
//TODO 需要实现list参数
} else {
Method m = clz.getMethod("get" +getMethodName(field.getName()));
String val = obj2JSONStr(m.invoke(o));
if(val!=null){
sb.append("\""+field.getName()+"\":"+val+",");
} else {
sb.append("\""+field.getName()+"\":null,");
}
}
}
if(sb.length()>1){
r = sb.substring(0,sb.length()-1);
r+="}";
}
return r;
}
//将属性值排序 partten rule>0则正序(小的在前面:a在前面),rule<0则倒叙(大的在前面:z在前面)
private static void sort(Field[] fields, int rule){
for(int i=0;i<fields.length;i++){
for(int k=0;k<fields.length;k++){
if(compare(fields[i].getName(),fields[k].getName())){
if(rule<0)swap(fields,i,k);
} else {
if(rule>0)swap(fields,i,k);
}
}
}
}
//交换field
private static void swap(Field[] fields, int i, int k){
Field f = fields[i];
fields[i]=fields[k];
fields[k]=f;
}
//比较字符串a>b则true,a<b则false,首先比较首字母,首字母相同则向后比较
private static Boolean compare(String a, String b){
char[] ca = a.toCharArray();
char[] cb = b.toCharArray();
for(int i=0;i<ca.length;i++){
if(i>cb.length-1)return true;
if(ca[i]<cb[i]){
return false;
}else if(ca[i]>cb[i]){
return true;
}
}
return false;
}
//获取首字母大写的参数名
private static String getMethodName(String fildeName) throws Exception{
byte[] items = fildeName.getBytes();
items[0] = (byte) ((char) items[0] - 'a' + 'A');
return new String(items);
}
public static void main(String[] args) throws Exception {
TA t= new TA();
t.setA("a");
t.setB("b");
t.setZ("z");
System.out.println(obj2JSONStr(t));
}
}
网友评论