CSVファイルからレコードを読み取りList<T>
、TがターゲットPOJOクラスであるを返すCSVローダークラスを作成しています。
CSVの例:
CSVから抽出されたレコードから、POJOクラスのフィールドの0
値を取得できますDate
。値がどこサンプル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;
}
私が持っている場合0
のためにDate
、目標POJOクラスのフィールド、私は(すでに予想されている)の下にエラーメッセージが表示されます。
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")
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;
}
};
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加