从 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>

  1. 解析:org.apache.commons.csv
  2. 转化率: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;
        }
    };
}