我正在使用opencsv使用opencsv注释读/写csv文件。
我的bean不仅有字段,还有java HashMap
字段。
现在我想做的是
public class MyBean {
@CsvBindByName(column = "ID")
private int id;
@CsvBindByName(column = "PROPERTIES")
private Map<String, String> sampleMap = new HashMap<String, String>();
要
ID, property1, property2...
1, value1, value2.....
我想让它在读/写中都能正常工作。
据我所知,默认的MappingStrategy在这种情况下不起作用。另外,创建自定义MappingStrategy对HashMap
字段没有意义。因为在迭代所有地图之前我们不知道完整的字段列表。
获取列名的另一种方法是从bean列表中读取一个bean。然后访问HashMap然后创建标题。(在我的情况下,Hashmap键在bean中修复)
MappingStrategy只关注类级元数据。像田野等。
public static Field[] getAllFields(Class<?> cls) {
List allFieldsList = getAllFieldsList(cls);
return (Field[])allFieldsList.toArray(new Field[allFieldsList.size()]);
}
访问用于创建csv头的真实数据看起来不是一种自然的方式。
关于如何解决这个问题的任何建议?
请指出那些可以读/写有Map
字段的bean的其他库。
干杯!
答案 0 :(得分:0)
可悲的是openCSV不支持这个。一个快速谷歌告诉我,SuperCSV接近但它将所有内容都放在地图中,而你想要控制地图中的内容以及什么不是。可能还有其他人,但大多数需要在对象中的字段和csv文件中的列之间一对一。
这是我想要开发多年并且贡献的东西,因为我目前工作的公司需要这样做,但是他们不想付钱给我开发它,并且当空闲时间可用时我对openCSV有更高的优先级。
可能但有限的解决方法是创建我称之为数据传输对象的方法。拥有一个自定义对象,它具有您拥有的所有值,并让它返回您想要的类型的对象(或者将具有所有字段的DTO转换为您想要的对象与地图和某些字段的转换器)。此解决方案的问题在于它会强制您事先知道地图中所有可能的条目。