7

有人可以帮忙吗?我坚持阅读 csv 文件并将其序列化到 POJO 上。我正在使用杰克逊库中的 CsvMapper。读取和序列化部分已完成并且工作正常。问题是当用户移动标题/列时,导致序列化做出一些按字母顺序排列的假设,即 CSV 文件上的值也是按字母顺序排列的。
例如(下面的文件在第一行有标题,第二行有人员详细信息值) personNameHeader,personAgeHeader Wiliam,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 始终为名称列后跟年龄列来注释类,这是不理想的。

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

4

2 回答 2

8

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

CsvSchema schema = csvMapper
    .typedSchemaFor(PersonDetailsCSVTemplate.class)
    .withHeader()
    .withColumnReordering(true);
于 2018-12-06T04:47:36.950 回答
4

您可以使用sortedBy并为其指定属性在 csv 数据中出现的顺序:

@JsonIgnoreProperties(ignoreUnknown = true)
@JsonPropertyOrder(value = { "personNameHeader", "personAgeHeader" })
static class PersonDetailsCSVTemplate
{
    @JsonProperty("personNameHeader")
    private String name;

    @JsonProperty("personAgeHeader")
    private String age;

    public String getName()
    {
        return name;
    }

    public void setName(String name)
    {
        this.name = name;
    }

    public String getAge()
    {
        return age;
    }

    public void setAge(String age)
    {
        this.age = age;
    }

    @Override
    public String toString()
    {
        return "PersonDetailsCSVTemplate [name=" + name + ", age=" + age + "]";
    }
}

您可以保留或保留@JsonPropertyOrder它不会影响输出。

@Test
public void sort() throws IOException
{
    CsvMapper csvMapper = new CsvMapper();
    CsvSchema schema = csvMapper
        .typedSchemaFor(PersonDetailsCSVTemplate.class)
        .withHeader()
        .sortedBy("personNameHeader", "personAgeHeader")
        .withColumnSeparator(',')
        .withComments();

    MappingIterator<PersonDetailsCSVTemplate> dataIterator =
        csvMapper
            .readerFor(PersonDetailsCSVTemplate.class)
            .with(schema)
            .readValues("personNameHeader,personAgeHeader\r\n"
                +
                "Wiliam,32\r\n");

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

        System.out.println(dataCSV);
    }
}

输出:

PersonDetailsCSVTemplate [name=Wiliam, age=32]
于 2017-06-27T16:57:30.033 回答