MappingStragety写入hashMap类型的字段

时间:2017-07-30 10:22:47

标签: java opencsv

我正在使用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的其他库。

干杯!

1 个答案:

答案 0 :(得分:0)

可悲的是openCSV不支持这个。一个快速谷歌告诉我,SuperCSV接近但它将所有内容都放在地图中,而你想要控制地图中的内容以及什么不是。可能还有其他人,但大多数需要在对象中的字段和csv文件中的列之间一对一。

这是我想要开发多年并且贡献的东西,因为我目前工作的公司需要这样做,但是他们不想付钱给我开发它,并且当空闲时间可用时我对openCSV有更高的优先级。

可能但有限的解决方法是创建我称之为数据传输对象的方法。拥有一个自定义对象,它具有您拥有的所有值,并让它返回您想要的类型的对象(或者将具有所有字段的DTO转换为您想要的对象与地图和某些字段的转换器)。此解决方案的问题在于它会强制您事先知道地图中所有可能的条目。