充分利用反射机制实现一个JSON转换工具

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34942689/article/details/86571493

在日常开发过程中,反射对于工程师来说一直都是一个很好的工具 .先简单介绍一下反射的几种实现方式
创建一个类对象 Class c = A.class;
方法一、通过获取类对象的方式 Class c2 = new A().getClass();
方法二、通过类名获取Class c3 = Class.forName(“A”);
方法三、通过new一个新的类对象A a = (A) c.newInstance();
接下来就使用基础的反射操作来实现一个对象转换成JSON

public class JsonUtil {
/**
 * 将指定的对象转换成JSON字符串
 *
 * @param object
 * @return
 */
public static String parseObject(Object object, Converter... converters) {
    if (object != null) {
        // 获得需要操作的对象的Class对象
        Class c = object.getClass();
        // 获得这个类中的所有属性
        Field[] fields = c.getDeclaredFields();
        // 拼接JSON
        StringBuilder sb = new StringBuilder();
        sb.append("{");
        // 循环遍历属性
        for (Field f : fields) {
            int m = f.getModifiers();
            NoJSON noJSON = f.getAnnotation(NoJSON.class);
            if (!Modifier.isStatic(m) && noJSON == null) {
                f.setAccessible(true);
                if (sb.length() != 1) {
                    sb.append(",");
                }
                sb.append("\"" + f.getName() + "\"");
                sb.append(":");
                Object value = null;
                try {
                    value = f.get(object);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                sb.append(PerseValue(value, converters));
            }
        }
        sb.append("}");
        return sb.toString();
    }
    return null;

}

/**
 * 解析对应的值
 * @param value
 * @param converters
 * @return
 */
private static String PerseValue(Object value, Converter... converters) {
    String resultStr = null;

    if (converters != null && converters.length > 0) {
        for (Converter converter : converters) {
            if (converter.getType() == value.getClass()) {
                resultStr = converter.converString(value);
                return "\"" + resultStr + "\"";
            }
        }
    }

    if (value != null) {
        if (value instanceof Number) {
            resultStr = String.valueOf(value);
        } else if (value instanceof String || value instanceof Character || value instanceof Boolean) {
            resultStr = "\"" + value + "\"";
        } else if (value instanceof Collection) {
            resultStr = parseCollection((Collection<?>) value);
        } else if (value instanceof Map) {
            resultStr = parseMap((Map) value);
        } else if (value.getClass().isArray()) {
            resultStr = parseArray((Object[]) value);
        } else {
            resultStr = parseObject(value);
        }
    }
    return resultStr;

}

/**
 * 将指定类型的数组转换成 json 字符串
 *
 * @param value
 * @return
 */
private static String parseArray(Object[] value) {
    return parseCollection(new ArrayList<>(Arrays.asList(value)));
}

// 创建一个转换器
public interface Converter {
    // 返回想要转换的数据类型
    Class getType();

    // 将值通过自定义的方式转换成String
    String converString(Object value);
}

/**
 * 将指定的集合转换成JSON字符串
 *
 * @return
 */
public static String parseCollection(Collection<?> collection, Converter... converters) {
    StringBuilder sb = new StringBuilder();
    sb.append("[");

    for (Object value : collection) {
        if (sb.length() != 1) {
            sb.append(",");
        }
        sb.append(PerseValue(value, converters));
    }
    sb.append("]");
    return sb.toString();
}

/**
 * 将指定的map转换成JSON字符串
 *
 * @return
 */
public static String parseMap(Map<?, ?> map, Converter... converters) {
    StringBuilder sb = new StringBuilder();
    sb.append("{");
    for (Entry entry : map.entrySet()) {
        if (sb.length() != 1) {
            sb.append(",");
        }
        sb.append("\"" + entry.getKey() + "\":");
        sb.append(PerseValue(entry.getValue(), converters));
    }

    sb.append("}");

    return sb.toString();

}

猜你喜欢

转载自blog.csdn.net/qq_34942689/article/details/86571493