反射处理json转对象字段个数不一致问题(对象包含list<?>)

8 阅读1分钟

/**
 * 反射处理json转对象字段个数不一致问题
 * @param obj
 * @param jsonObject
 */
private static void populateObject(Object obj, JSONObject jsonObject) {
    Class<?> objClass = obj.getClass();
    Field[] fields = objClass.getDeclaredFields();

    for (Field field : fields) {
        field.setAccessible(true); // 允许访问私有字段
        String fieldName = field.getName();
        // 如果 JSON 中有该字段
        if (jsonObject.containsKey(fieldName)) {
            try {
                // 根据字段类型进行赋值
                if (field.getType() == String.class) {
                    field.set(obj, jsonObject.getString(fieldName));
                } else if (field.getType() == int.class || field.getType() == Integer.class) {
                    field.set(obj, jsonObject.getInteger(fieldName));
                } else if (field.getType() == boolean.class || field.getType() == Boolean.class) {
                    field.set(obj, jsonObject.getBoolean(fieldName));
                } else if (field.getType() == long.class || field.getType() == Long.class) {
                    field.set(obj, jsonObject.getLong(fieldName));
                } else if (field.getType() == double.class || field.getType() == Double.class) {
                    field.set(obj, jsonObject.getDouble(fieldName));
                } else if (field.getType() == float.class || field.getType() == Float.class) {
                    field.set(obj, jsonObject.getFloat(fieldName));
                } else if (field.getType() == short.class || field.getType() == Short.class) {
                    field.set(obj, jsonObject.getShort(fieldName));
                } else if (field.getType() == byte.class || field.getType() == Byte.class) {
                    field.set(obj, jsonObject.getByte(fieldName));
                } else if (field.getType() == char.class || field.getType() == Character.class) {
                    String value = jsonObject.getString(fieldName);
                    field.set(obj, value.length() > 0 ? value.charAt(0) : '\0'); // 处理字符类型
                } else if (field.getType() == List.class) {
                    //获取数据
                    JSONArray jsonArray = jsonObject.getJSONArray(fieldName);
                    // 获取 List 中元素的具体类型
                    ParameterizedType parameterizedType = (ParameterizedType) field.getGenericType();
                    Class<?> elementClass = (Class<?>) parameterizedType.getActualTypeArguments()[0];
                    List<Object> list = new ArrayList<>();
                    for (int i = 0; i < jsonArray.size(); i++) {
                        JSONObject itemJson = jsonArray.getJSONObject(i);
                        Object item = elementClass.getDeclaredConstructor().newInstance(); // 创建类型实例
                        populateObject(item, itemJson); // 递归填充
                        list.add(item);
                    }
                    field.set(obj, list);//设置数据
                }  else {
                    // 处理嵌套对象
                    if ("defaultValue".equals(fieldName)){//特殊处理默认值
                        field.set(obj, jsonObject.get(fieldName));
                    }else {
                        JSONObject nestedObject = jsonObject.getJSONObject(fieldName);
                        Object nestedObj = field.getType().newInstance();
                        populateObject(nestedObj, nestedObject);
                        field.set(obj, nestedObj);
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}