Java 从地图转换<;字符串,字符串>;到波乔

Java 从地图转换<;字符串,字符串>;到波乔,java,csv,deserialization,objectmapper,Java,Csv,Deserialization,Objectmapper,我正在创建一个CSV加载程序类,它从CSV文件中读取记录并返回一个列表,其中T是目标POJO类 示例CSV: 从CSV提取的记录中,可以为POJO类的Date字段获取0值。从示例CSV中,记录#2,其中createdDate的值为0。在实际反序列化发生之前,如何首先将0更改为有效日期(例如1970-01-01 09:00:00) 我已成功创建了读取CSV文件以转换为返回列表的过程 解析:org.apache.commons.csv 转换:com.fasterxml.jackson.databi

我正在创建一个CSV加载程序类,它从CSV文件中读取记录并返回一个
列表,其中T是目标POJO类

示例CSV:

从CSV提取的记录中,可以为POJO类的
Date
字段获取
0
值。从示例CSV中,记录#2,其中
createdDate
的值为
0
。在实际反序列化发生之前,如何首先将
0
更改为有效日期(例如
1970-01-01 09:00:00

我已成功创建了读取CSV文件以转换为返回
列表的过程

  • 解析:
    org.apache.commons.csv
  • 转换:
    com.fasterxml.jackson.databind.ObjectMapper
    我正在考虑重写我的
    ObjectMapper
    的一些函数来操作这些值,但我不知道如何操作
  • 私有列表转换为对象列表(列表csvRecordMapList,类targetClass){
    List csvRecordObjList=new ArrayList();
    SimpleDateFormat dateFormat=新的SimpleDateFormat(“yyyy-MM-dd HH:MM:ss”);
    ObjectMapper ObjectMapper=新的ObjectMapper();
    objectMapper.setDateFormat(日期格式);
    objectMapper.disable(反序列化功能。在未知属性上失败);
    用于(地图记录地图:csvRecordMapList)
    添加(objectMapper.convertValue(recordMap,targetClass));
    返回csvRecordObjList;
    }
    
    如果目标POJO类的
    Date
    字段有
    0
    ,我会得到下面的错误消息(这是预期的):


    你可以试试下面这样的东西。(代码未编译)

    for(地图记录地图:csvRecordMapList){
    if(recordMap.getKey().equals(“createdDate”)&&recordMap.value().equals(“0”)){
    记录地图放置(“createdDate”,“1970-01-01 09:00:00”);
    } 
    添加(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;
    }
    

    您是否有理由首先将CSV读入地图列表?为什么不逐行阅读CSV并直接转换到T类?是的,我需要进一步处理的地图列表,所以我认为我应该这样做以尽量减少冗余。类加载器必须是泛型的,以适应不同的类T,这就是为什么我要使用现有库进行POJO转换。类加载器必须是泛型的,以适应不同的类T,这意味着“createdDate”与不同的类不一致。这将是一个可行的解决方案。但是,谢谢你的想法!:)
    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));
    }   
    
    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;
            }
        };
    }