美文网首页
对象转字符串(按照属性排序)

对象转字符串(按照属性排序)

作者: Ukuleler | 来源:发表于2019-07-24 18:07 被阅读0次

如题,该工具通过反射实现对象转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));
    }
}

相关文章

  • 对象转字符串(按照属性排序)

    如题,该工具通过反射实现对象转json字符串,可以按照对象属性首字母(首字母相同则依次向后比对)进行顺序或逆序排序...

  • 2018-02-24

    1. 对数组对象属性排序 思路很简单,利用sort方法对对象数组按照对象属性进行排序,不过不要卡壳了~ 2. 数组...

  • 2018-08-15 JSON.Stringfy的注意事项

    1: 对象转字符串 对象转字符串时,最后不能出现逗号,否则会出现符号异常。 对象转字符串时,如果属性的值是Func...

  • java 学习笔记之 TreeSet 集合 排序

    创建一个Student对象 含有name, age属性按照name的长度排序 长度相等按照姓名的大小排序 ...

  • java8的List.sort()排序功能

    //按照List中对象的fileKind属性排序 PathInfoList.sort(Comparator.com...

  • JSON字符串,JSON对象

    json对象 可直接使用jQuery进行操作(对象.属性) json字符串 普通的字符串,可以按照字符串进行截取,...

  • 前端宝典

    一、排序 1.根据对象内某一属性进行排序(过滤掉字符串,数值相比较排序) 排序前 排序后 const arr2 =...

  • 数组的几种排序法

    <1>描述:字符串对象都可以排序// 创建描述对象就是对数组排序的,它可以把数组中元素的某个属性作为key 进行...

  • js 对象按照属性值进行排序

    业务需求需要,需要对下面这个对象,按照column进行升序排序: 实现如下: 看看输出结果: 就是咱想要的,完美。...

  • Android数据库SQLite排序问题一:字符串类型的数值排序

    在android中,数据库操作使用的是SQLite,字段为varchar属性时,排序就会按照字符串的规则就行排序。...

网友评论

      本文标题:对象转字符串(按照属性排序)

      本文链接:https://www.haomeiwen.com/subject/bpefrctx.html