驼峰转下划线 相关工具类

Siona

驼峰转下划线

将实体类中所有属性名从驼峰式转换为下划线形式(包含嵌套的实体类、集合等)

如果你的实体类中包含嵌套的实体类、集合等,并且想要将所有属性名从驼峰式转换为下划线形式,你可以递归地处理这些属性。以下是一个更完整的例子,该工具类可以处理嵌套的实体类和集合:

import java.lang.reflect.Field;
import java.util.*;

public class CamelCaseToUnderscoreConverter {

    public static <T> Map<String, Object> convertToMap(T entity) {
        return convertToMap(entity, new HashSet<>());
    }

    private static <T> Map<String, Object> convertToMap(T entity, Set<Object> visited) {
        Map<String, Object> result = new HashMap<>();

        try {
            if (entity == null || visited.contains(entity)) {
                return result;
            }

            visited.add(entity);

            Class<?> clazz = entity.getClass();
            Field[] fields = clazz.getDeclaredFields();

            for (Field field : fields) {
                field.setAccessible(true);
                String camelCaseName = field.getName();
                String underscoreName = camelCaseToUnderscore(camelCaseName);
                Object value = field.get(entity);

                if (value != null) {
                    if (isSimpleType(value)) {
                        result.put(underscoreName, value);
                    } else if (value instanceof Collection<?>) {
                        Collection<?> collection = (Collection<?>) value;
                        List<Map<String, Object>> collectionList = new ArrayList<>();
                        for (Object item : collection) {
                            collectionList.add(convertToMap(item, visited));
                        }
                        result.put(underscoreName, collectionList);
                    } else if (value.getClass().isArray()) {
                        Object[] array = (Object[]) value;
                        List<Map<String, Object>> arraylist = new ArrayList<>();
                        for (Object item : array) {
                            arraylist.add(convertToMap(item, visited));
                        }
                        result.put(underscoreName, arraylist);
                    } else {
                        result.put(underscoreName, convertToMap(value, visited));
                    }
                }
            }

        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }

        return result;
    }

    private static String camelCaseToUnderscore(String camelCase) {
        StringBuilder result = new StringBuilder();
        for (int i = 0; i < camelCase.length(); i++) {
            char currentChar = camelCase.charAt(i);
            if (Character.isUpperCase(currentChar)) {
                result.append("_").append(Character.toLowerCase(currentChar));
            } else {
                result.append(currentChar);
            }
        }
        return result.toString();
    }

    private static boolean isSimpleType(Object obj) {
        return obj instanceof String ||
               obj instanceof Number ||
               obj instanceof Boolean ||
               obj instanceof Date;
    }

    public static void main(String[] args) {
        // 示例用法
        YourEntity innerEntity = new YourEntity();
        innerEntity.setInnerField("InnerValue");

        YourEntity entity = new YourEntity();
        entity.setUserName("JohnDoe");
        entity.setAge(25);
        entity.setInnerEntity(innerEntity);

        List<YourEntity> entityList = new ArrayList<>();
        entityList.add(entity);

        Map<String, Object> resultMap = CamelCaseToUnderscoreConverter.convertToMap(entity);
        System.out.println(resultMap);
    }
}

这个示例中,convertToMap 方法会递归处理实体类中的所有属性,包括嵌套的实体类和集合。工具类通过使用 Set<Object> 来跟踪已访问的对象,防止无限递归。请根据你的实际需求进行适当的修改。

Last Updated 3/2/2024, 4:00:59 PM