Java 从地图转换<;字符串,字符串>;到波乔
我正在创建一个CSV加载程序类,它从CSV文件中读取记录并返回一个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
列表,其中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;
}
};
}