从 Map<String, String> 转换为 POJO
Converting from Map<String, String> to POJO
我正在创建一个 CSV 加载程序 class,它从 CSV 文件和 returns 读取记录 List<T>
,其中 T 是目标 POJO class.
CSV 样本:
从 CSV 中提取的记录中,可以获得 POJO class 的 Date
字段的 0
值。在示例 CSV 中,记录 #2,其中 createdDate
的值为 0
。如何在实际反序列化发生之前首先将 0
更改为有效日期(例如 1970-01-01 09:00:00
)?
我已经成功创建了读取 CSV 文件以转换为返回的过程 List<T>
。
- 解析:
org.apache.commons.csv
- 转化率:
com.fasterxml.jackson.databind.ObjectMapper
我正在考虑重写 ObjectMapper
的一些函数来操纵这些值,但我不知道该怎么做。
private List<T> convertToObjectList(List<Map<String, String>> csvRecordMapList, Class<T> targetClass) {
List<T> csvRecordObjList = new ArrayList<>();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setDateFormat(dateFormat);
objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
for(Map<String, String> recordMap : csvRecordMapList)
csvRecordObjList.add(objectMapper.convertValue(recordMap, targetClass));
return csvRecordObjList;
}
如果目标 POJO class 的 Date
字段有 0
,我会收到以下错误消息(这已经是预期的):
Can not construct instance of java.util.Date from String value '0': not a valid representation (error: Failed to parse Date value '0': Unparseable date: "0")
您可以尝试下面这样的操作。 (代码未编译)。
for(Map<String, String> recordMap : csvRecordMapList) {
if(recordMap.getKey().equals("createdDate") && recordMap.value().equals("0")) {
recordMap.put("createdDate", "1970-01-01 09:00:00");
}
csvRecordObjList.add(objectMapper.convertValue(recordMap, targetClass));
}
我没有使用 ObjectMapper,而是使用了 org.apache.commons.beanutils.BeanUtils 和 ConvertUtils。我发现您可以添加自定义转换器。以下是我更新的源代码:
private List<T> convertToObjectList(List<Map<String, String>> csvRecordMapList, Class<T> targetClass)
throws IllegalAccessException, InvocationTargetException, InstantiationException {
List<T> csvRecordObjList = new ArrayList<>();
ConvertUtils.register(getDateConverter(), Date.class);
for (Map<String, String> recordMap : csvRecordMapList) {
T targetClassObj = targetClass.newInstance();
BeanUtils.populate(targetClassObj, recordMap);
csvRecordObjList.add(targetClassObj);
}
return csvRecordObjList;
}
这是我定制的转换器:
private static Converter getDateConverter() {
return new Converter() {
@SuppressWarnings({ "unchecked", "rawtypes" })
@Override
public Object convert(Class classType, Object value) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = null;
try {
date = value.equals("0") ? new Date(0) : sdf.parse((String) value);
} catch (ParseException e) {
// Do nothing
}
return date;
}
};
}
我正在创建一个 CSV 加载程序 class,它从 CSV 文件和 returns 读取记录 List<T>
,其中 T 是目标 POJO class.
CSV 样本:
从 CSV 中提取的记录中,可以获得 POJO class 的 Date
字段的 0
值。在示例 CSV 中,记录 #2,其中 createdDate
的值为 0
。如何在实际反序列化发生之前首先将 0
更改为有效日期(例如 1970-01-01 09:00:00
)?
我已经成功创建了读取 CSV 文件以转换为返回的过程 List<T>
。
- 解析:
org.apache.commons.csv
- 转化率:
com.fasterxml.jackson.databind.ObjectMapper
我正在考虑重写ObjectMapper
的一些函数来操纵这些值,但我不知道该怎么做。
private List<T> convertToObjectList(List<Map<String, String>> csvRecordMapList, Class<T> targetClass) {
List<T> csvRecordObjList = new ArrayList<>();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setDateFormat(dateFormat);
objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
for(Map<String, String> recordMap : csvRecordMapList)
csvRecordObjList.add(objectMapper.convertValue(recordMap, targetClass));
return csvRecordObjList;
}
如果目标 POJO class 的 Date
字段有 0
,我会收到以下错误消息(这已经是预期的):
Can not construct instance of java.util.Date from String value '0': not a valid representation (error: Failed to parse Date value '0': Unparseable date: "0")
您可以尝试下面这样的操作。 (代码未编译)。
for(Map<String, String> recordMap : csvRecordMapList) {
if(recordMap.getKey().equals("createdDate") && recordMap.value().equals("0")) {
recordMap.put("createdDate", "1970-01-01 09:00:00");
}
csvRecordObjList.add(objectMapper.convertValue(recordMap, targetClass));
}
我没有使用 ObjectMapper,而是使用了 org.apache.commons.beanutils.BeanUtils 和 ConvertUtils。我发现您可以添加自定义转换器。以下是我更新的源代码:
private List<T> convertToObjectList(List<Map<String, String>> csvRecordMapList, Class<T> targetClass)
throws IllegalAccessException, InvocationTargetException, InstantiationException {
List<T> csvRecordObjList = new ArrayList<>();
ConvertUtils.register(getDateConverter(), Date.class);
for (Map<String, String> recordMap : csvRecordMapList) {
T targetClassObj = targetClass.newInstance();
BeanUtils.populate(targetClassObj, recordMap);
csvRecordObjList.add(targetClassObj);
}
return csvRecordObjList;
}
这是我定制的转换器:
private static Converter getDateConverter() {
return new Converter() {
@SuppressWarnings({ "unchecked", "rawtypes" })
@Override
public Object convert(Class classType, Object value) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = null;
try {
date = value.equals("0") ? new Date(0) : sdf.parse((String) value);
} catch (ParseException e) {
// Do nothing
}
return date;
}
};
}