代码之家  ›  专栏  ›  技术社区  ›  user1796624

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

  •  0
  • user1796624  · 技术社区  · 6 年前

    使用自定义列分隔符“;”分析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 回复  |  直到 6 年前
        1
  •  3
  •   DwB    6 年前

    解决问题的方法是:注意异常消息。

    以下是您包含的异常消息:

    com.fasterxml.jackson.databind.JsonMappingException:无法从字符串值('Email;FirstName;LastName')实例化类型为[simple type,class Author]的值;没有单字符串构造函数/工厂方法

    步骤1:请注意异常消息中的这一点: 没有单字符串构造函数/工厂方法

    第二步:看一下 Author 请注意,它既不包括构造函数,也不包括接受

    步骤3:将构造函数添加到

    以下是一些代码(这不是最终代码,您需要添加错误处理):

    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];
    }
    
        2
  •  1
  •   Bor Laze    6 年前
    CsvSchema bootstrapSchema = CsvSchema.emptySchema();
    bootstrapSchema.withColumnSeparator(';').withoutQuoteChar();
    

    在这一部分我不确定-这不是一个构建器模式。

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

        3
  •  0
  •   blackwizard    4 年前

    接受的答案确实允许根据异常消息上的建议解决OP问题。 然而,使用 CSVMapper 是关于不为拆分分隔符和字段赋值编写代码。这就是自由党应该做的。

    当我遇到同样的问题时,我挖掘了一下,发现了以下内容。这一切都是关于使用 typedSchemaFor 哪里 type 是目标类。 真的有点让人不安 至于映射器和模式。

    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();
    }