使用自定义分隔符列解析 CSV 未正确映射到 POJO

在使用自定义列分隔符“;”解析 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;

    }


}


慕雪6442864
浏览 173回答 3
3回答

潇潇雨雨

通常情况下,您的问题的解决方案是:注意异常消息。这是您包含的异常消息:com.fasterxml.jackson.databind.JsonMappingException:无法从字符串值('Email;FirstName;LastName')实例化类型 [简单类型,作者类] 的值;没有单字符串构造函数/工厂方法这是您问题的 3 步解决方案:第 1 步:在异常消息中注意这一点:没有单字符串构造函数/工厂方法第 2 步:查看Author您包含的课程。请注意,它既不包含构造函数,也不包含仅接受一个字符串作为参数的工厂方法。第 3 步:将构造函数添加到Author接受单个字符串作为参数的类。这是一些代码(这不是最终代码,您需要添加错误处理):public Author(final String line){&nbsp; final String[] lineContentArray = line.split(";");&nbsp; // Note: consider using the standard java field naming convention.&nbsp; email = line[0];&nbsp; firstName = line[1];&nbsp; lastName = line[2];}

尚方宝剑之说

CsvSchema bootstrapSchema = CsvSchema.emptySchema();bootstrapSchema.withColumnSeparator(';').withoutQuoteChar();我不确定这部分 - 它不是构建器模式。尝试CsvSchema bootstrapSchema = CsvSchema.emptySchema().bootstrapSchema.withColumnSeparator(';').withoutQuoteChar();反而。

皈依舞

接受的答案确实允许根据异常消息的建议解决 OP 问题。但是,使用的重点CSVMapper是不要为分隔符周围的拆分和字段分配编写代码。这就是lib应该做的。当我遇到同样的问题时,我挖掘了一下,发现了以下内容。这完全是关于使用typedSchemaForwhere typeis the target class。确实有点令人不安,必须将typeas 传递给映射器和模式。ObjectReader objectReader() {&nbsp; CsvMapper mapper = new CsvMapper();&nbsp; CsvSchema schema = schema(mapper);&nbsp; return mapper.readerFor(type).with(schema);}&nbsp; &nbsp;&nbsp;CsvSchema schema(CsvMapper mapper) {&nbsp; return mapper.typedSchemaFor(type)&nbsp; &nbsp; .withColumnSeparator(';')&nbsp; &nbsp; .withoutHeader()&nbsp; &nbsp; .withoutQuoteChar();}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java