java - 如何使用 Java 中的 CsvMapper 将 header 动态分配给 csv 文件

标签 java csv mapping jackson-dataformat-xml

有人可以帮忙吗? 我坚持读取 csv 文件并将其序列化到 POJO 上。 我正在使用 jackson 库中的 CsvMapper。阅读和序列化部分已完成并且工作正常。问题是当用户移动标题/列时导致序列化做出一些字母顺序假设,即 CSV 文件上的值也是按字母顺序排列的。
例如(下面的文件在第一行有标题,第二行有人员详细信息值) personNameHeader,personAgeHeader 威廉,32岁

现在我的POJO如下

@JsonIgnoreProperties(ignoreUnknown = true)
// @JsonPropertyOrder(value = {"personNameHeader", "personAgeHeader" })
public class PersonDetailsCSVTemplate  {

@JsonProperty("personNameHeader")
private String name;

@JsonProperty("personAgeHeader")
private String age;

//Public constructor and getters and setters...

这是从 CSV 中读取值并映射到类的代码

import com.fasterxml.jackson.databind.MappingIterator;
import com.fasterxml.jackson.dataformat.csv.CsvMapper;
import com.fasterxml.jackson.dataformat.csv.CsvSchema;
...

    CsvMapper csvMapper = new CsvMapper();    
    CsvSchema schema = csvMapper.typedSchemaFor(PersonDetailsCSVTemplate.class).withHeader();
          MappingIterator<PersonDetailsCSVTemplate  > dataIterator = csvMapper.readerFor(PersonDetailsCSVTemplate.class).with(schema)
            .readValues(data);

     while (dataIterator.hasNextValue()) {
        PersonDetailsCSVTemplate dataCSV = dataIterator.nextValue();
}

在序列化之后,可以看到 CsvMapper 映射了以下内容: PersonDetailsCSVTemplate.name = "32"PersonDetailsCSVTemplate.age = "Wiliam"

通过使用 @JsonPropertyOrder(value = {"personNameHeader", "personAgeHeader"}) 注释类强制 CSV 始终是名称列后跟年龄列,这并不理想。

任何人都可以提出他们认为可行的任何建议吗? 问候

最佳答案

从 Jackson 2.7 开始,您可以使用 withColumnReordering(true) 而不是 sortedBy()

CsvSchema schema = csvMapper
    .typedSchemaFor(PersonDetailsCSVTemplate.class)
    .withHeader()
    .withColumnReordering(true);

关于java - 如何使用 Java 中的 CsvMapper 将 header 动态分配给 csv 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44785689/

相关文章:

symfony - 学说2映射覆盖从MappedSuperclass继承的inversedBy字段

java - 无法加载 Logmanager "org.jboss.logmanager.LogManager"java.lang.ClassNotFoundException : org. jboss.logmanager.LogManager

java - 文件名作为列-hadoop

python - 将包含以逗号分隔的值的 CSV 文件转换为多列 CSV 文件

Python:将数据从大型 csv 导入到 sqlite 数据库

Java-Stream - 使用 Collector groupingBy 创建聚合对象列表

java - 如何使用 .find JPA 不显示密码

java - UIMA ruta - 使用来自不同 View 的注释

python - 使用 Azure 函数在 HTTP 响应中导出 CSV 数据格式时出错

c# - 流利的 Nhibernate 内连接