首页 > 解决方案 > 将 JAXB 注释类映射到 CSV(或通用格式)

问题描述

我有一定数量的 JAXB 注释类,它们是从一些 DTD 生成的,它们允许我以非常自动的方式将对象转换为 xml 和 xml 到对象。这些xml被发送到一些供应商给我们的一些远程服务。然后其他 xmls 被接收并解析为我们的域对象。

申请过程是这样的

将接收到的 XML 文件转换为 JAXB 对象,然后转换为域对象的逆流是类似的。

域对象和 JAXB 对象之间的映射不是自动的:字段和结构是不同的。所以这里面有一些逻辑。

现在供应商要求我们提供 CSV 文件而不是 XML 文件。这是一个问题,因为我们不想复制映射逻辑。所以我们想重用 JAXB 对象(可能还有它们的注解)。

如果可能的话,我们还希望避免进行 2 个步骤的过程,例如生成 xml,然后将其转换为 CSV(对于逆过程也是如此)。

有没有办法使用 JAXB 对象(即 JAXB 注释)将对象“自动”映射到 CSV?更清楚地说,顶部将能够将 xml 标记的名称保存到 csv 列中。

否则我们怎么能以某种优雅的方式解决这个问题?

注意。我知道如何将 java 类映射到 csv 列。我对“优雅”的意思是无需重写新的映射类,或者可能无需更改数据映射。例如,Jackson-dqataformat-text 中的 ObjectMapper 可以进行数据转换,但在这种情况下,我必须使用 java 对象字段名称而不是 xml 中使用的映射字段

谢谢你的支持

标签: javaxmlcsvjaxb

解决方案


这是不可能的。JAXB(Jakarta XML Binding)便于xml和java之间的映射。它允许将 java 对象转换为 xml 并将 xml 转换为 java 对象。因此,不能使用此框架将 java 对象转换为 CSV。了解更多信息

但是其他一些框架支持您的要求,将 java 对象转换为 csv。opencsv 是在 java 中使用 csv 的最佳库。了解更多信息

以下示例与 opencsv 有关。

人.java

public class Person {
    
    @CsvBindByPosition(position = 0)
    private int id;
    @CsvBindByPosition(position = 1)
    private String name;
    
    public Person(int id, String name) {
        super();
        this.id = id;
        this.name = name;
    }
    
    public int getId() {
        return id;
    }
    public String getName() {
        return name;
    }
}

将人员列表转换为 csv

try {
    FileWriter writer = new  FileWriter("output.csv");
  
    List<Person> listPerson = new ArrayList<Person>();
    listPerson.add(new Person(1, "Test One"));
    listPerson.add(new Person(2, "Test Two"));
  
    ColumnPositionMappingStrategy mappingStrategy=  new ColumnPositionMappingStrategy();
    mappingStrategy.setType(Person.class);
  
    StatefulBeanToCsvBuilder<Person> builder= new StatefulBeanToCsvBuilder(writer);
    StatefulBeanToCsv beanWriter =  builder.withMappingStrategy(mappingStrategy).build();
  
    beanWriter.write(listPerson);
    writer.close();
            
} catch (Exception e) {
    e.printStackTrace();
}

输出,

1, Test One
2, Test Two

将以下依赖项添加到您的项目中,

  • 打开csv
  • commons-beanutils
  • 公共收藏
  • 公共语言3
  • 公共记录

推荐阅读