java 通过反射对象赋值
在开发过程中经常需要对接第三方接口来获取数据,第三方接口返回的数据需赋值到实体类当中,一个个
get
set
比较麻烦,所以我们就可以使用java
反射进行对象赋值
/**
* description: json 字符 转 pojo 对象
* create by: Mr.Fang
*
* @param json 字符
* @param config 配置 key JSON字符的key value对应的实体类字段
* Map<String, String> stringStringHashMap = new HashMap<>();
* stringStringHashMap.put("statusDesc", ""); key不为空 value 为空 表示实体类没有该字段
* stringStringHashMap.put("subShareFee", "ccc"); key不为空 value 不为空
* @param targetObject java 实体类
* @return: void
* @date: 2023/11/6 14:39
*/
public static void populateObjectFromJson(String json, Object targetObject, Map<String, String> config) {
try {
// 将 JSON 字符转 JSON对象
JSONObject jsonObject = JSONUtil.strToObj(json, JSONObject.class);
Class<?> targetClass = targetObject.getClass();
for (String key : jsonObject.keySet()) {
// 将 JSON 键从下划线转换为驼峰命名
String camelCaseKey = convertJsonKeyToCamelCase(key);
Field field;
if (Objects.nonNull(config) && config.containsKey(camelCaseKey)) {
String targetKey = config.get(camelCaseKey);
if (StringUtils.isEmpty(targetKey)) { // 目标key为空 跳过改字段处理
continue;
}
field = targetClass.getDeclaredField(targetKey);
} else {
field = targetClass.getDeclaredField(camelCaseKey);
}
field.setAccessible(true);
Object jsonValue = jsonObject.get(key);
if (Objects.isNull(jsonValue)) {
continue; //数值为空跳过
}
// 根据字段类型设置字段的值,同之前的示例
Class<?> fieldType = field.getType();
if (fieldType == String.class) {
field.set(targetObject, jsonValue.toString());
} else if (fieldType == int.class || fieldType == Integer.class) {
field.set(targetObject, jsonObject.getIntValue(key));
} else if (fieldType == boolean.class || fieldType == Boolean.class) {
field.set(targetObject, jsonObject.getBoolean(key));
} else if (fieldType == double.class || fieldType == Double.class) {
field.set(targetObject, jsonObject.getDouble(key));
} else if (fieldType == Date.class) {
field.set(targetObject, jsonObject.getDate(key));
} else if (fieldType == BigDecimal.class) {
field.set(targetObject, jsonObject.getBigDecimal(key));
}
field.setAccessible(false);
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* description: json 字符转驼峰命名
* create by: Mr.Fang
*
* @param: [jsonKey]
* @return: java.lang.String
* @date: 2023/11/6 14:41
*/
private static String convertJsonKeyToCamelCase(String jsonKey) {
String[] parts = jsonKey.split("_");
StringBuilder camelCaseKey = new StringBuilder(parts[0]);
for (int i = 1; i < parts.length; i++) {
camelCaseKey.append(StringUtils.capitalize(parts[i]));
}
return camelCaseKey.toString();
}