为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕雪6442864 2022-05-25 09:42:19
在使用自定义列分隔符“;”解析 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;    }}
查看完整描述

3 回答

?
潇潇雨雨

TA贡献1833条经验 获得超4个赞

通常情况下,您的问题的解决方案是:注意异常消息。

这是您包含的异常消息:

com.fasterxml.jackson.databind.JsonMappingException:无法从字符串值('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];

}


查看完整回答
反对 回复 2022-05-25
?
尚方宝剑之说

TA贡献1788条经验 获得超4个赞

CsvSchema bootstrapSchema = CsvSchema.emptySchema();

bootstrapSchema.withColumnSeparator(';').withoutQuoteChar();

我不确定这部分 - 它不是构建器模式。


尝试


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

反而。


查看完整回答
反对 回复 2022-05-25
?
皈依舞

TA贡献1851条经验 获得超3个赞

接受的答案确实允许根据异常消息的建议解决 OP 问题。但是,使用的重点CSVMapper是不要为分隔符周围的拆分和字段分配编写代码。这就是lib应该做的。


当我遇到同样的问题时,我挖掘了一下,发现了以下内容。这完全是关于使用typedSchemaForwhere typeis the target class。确实有点令人不安,必须将typeas 传递给映射器和模式。


ObjectReader objectReader() {

  CsvMapper mapper = new CsvMapper();

  CsvSchema schema = schema(mapper);

  return mapper.readerFor(type).with(schema);

}

    

CsvSchema schema(CsvMapper mapper) {

  return mapper.typedSchemaFor(type)

    .withColumnSeparator(';')

    .withoutHeader()

    .withoutQuoteChar();

}


查看完整回答
反对 回复 2022-05-25
  • 3 回答
  • 0 关注
  • 172 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号