MappingStragety用于编写hashMap类型的字段

我正在使用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对 HashMap 字段没有意义 . 因为在迭代所有 Map 之前我们不知道完整的字段列表 .

获取列名的另一种方法是只从bean列表中读取一个bean . 然后访问HashMap然后创建 Headers . (在我的情况下,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)

3 years ago

可悲的是,openCSV并不支持这一点 . 一个快速的谷歌向我展示了SuperCSV接近但它将所有内容放在 Map 中,而你想要控制 Map 中的内容和不会发生什么 . 可能还有其他人,但大多数需要在对象的字段和csv文件中的列之间一对一 .

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

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