Синтаксический анализ CSV с пользовательским разделителем столбца не отображается должным образом в POJO - PullRequest
0 голосов
/ 27 января 2019

При синтаксическом анализе CSV с пользовательским разделителем столбцов ';'и используя:

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

я получаю следующую ошибку:

com.fasterxml.jackson.databind.JsonMappingException: Can not instantiate value of type [simple type, class Author] from String value ('Email;FirstName;LastName'); no single-String constructor/factory method

вот мой код синтаксического анализа:

public static <T> List<T> loadObjectList(Class<T> type, String fileName) {
     CsvSchema bootstrapSchema = CsvSchema.emptySchema();
     bootstrapSchema.withColumnSeparator(';').withoutQuoteChar();
     CsvMapper mapper = new CsvMapper();
     File file = new File(fileName);
     MappingIterator<T> readValues = 
         mapper.reader(type)
            .with(bootstrapSchema)
            .readValues(new InputStreamReader(new FileInputStream(file), "ISO-8859-1"));
     return readValues.readAll();
}

и вот моя модель, я хочусопоставить с CSV:

@JsonPropertyOrder({ "Email", "FirstName", "LastName" })
public class Author {

    String Email;
    String FirstName;
    String LastName;

    public String getEmail() {
        return Email;
    }

    public void setEmail(String Email) {
        this.Email = Email;
    }

    public String getFirstName() {
        return FirstName;
    }

    public void setFirstName(String firstName) {
        FirstName = firstName;
    }

    public String getLastName() {
        return LastName;
    }

    public void setLastName(String lastName) {
        LastName = lastName;
    }

    public Author(String email, String firstName, String lastName) {
        Email = email;
        FirstName = firstName;
        LastName = lastName;
    }

}

Ответы [ 2 ]

0 голосов
/ 27 января 2019

Как это часто бывает, Решение вашей проблемы заключается в следующем: обратите внимание на сообщение об исключении.

Вот сообщение об исключении, которое вы включили:

com.fasterxml.jackson.databind.JsonMappingException: невозможно создать экземпляр значения типа [простой тип, класс Author] из строкового значения ('Email; FirstName; LastName'); нет однострокового конструктора / фабричного метода

Вот 3 шага решения вашего вопроса:

Шаг 1: Обратите внимание на это в сообщении об исключении: нет однострокового конструктора / фабричного метода

Шаг 2: Посмотрите на класс Author, который вы включили. Обратите внимание, что он не включает ни конструктор, ни метод фабрики, который принимает ровно одна строка в качестве параметра.

Шаг 3: Добавить конструктор к классу Author, который принимает одну строку в качестве параметра.

Вот некоторый код (это не окончательный код, вам нужно будет добавить обработку ошибок):

public Author(final String line)
{
  final String[] lineContentArray = line.split(";");

  // Note: consider using the standard java field naming convention.
  email = line[0];
  firstName = line[1];
  lastName = line[2];
}
0 голосов
/ 27 января 2019
CsvSchema bootstrapSchema = CsvSchema.emptySchema();
bootstrapSchema.withColumnSeparator(';').withoutQuoteChar();

Я не уверен в этой части - это не шаблон построения.

Попробуйте вместо

CsvSchema bootstrapSchema = CsvSchema.emptySchema().bootstrapSchema.withColumnSeparator(';').withoutQuoteChar();

.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...