【问题标题】:How to import data from a csv file into a java object arraylist with the Jackson library? please如何使用 Jackson 库将 csv 文件中的数据导入 java 对象数组列表?请
【发布时间】:2021-06-07 06:56:43
【问题描述】:

有问题的对象:

public class DataSupplyPoint {

    private String date;
    private double value;
    private SupplyPoint supplyPoint;

    public DataSupplyPoint(String date, double value, SupplyPoint supplyPoint) {
        super();
        this.date = date;
        this.value = value;
        this.supplyPoint = supplyPoint;
    }

我的 csv 文件示例:

supplyPoint,date,value
0123456678,2021-03-10,2412.1999
0123456678,2021-06-10,3412.1999
0123456678,2021-09-10,4412.1999
0123456678,2021-12-10,5412.1999
0123456678,2021-03-10,2412.1999
0123456678,2021-06-10,3412.1999
0123456678,2021-09-10,4412.1999
0123456678,2021-12-10,5412.1999

我想做什么:

public ArrayList<DataSupplyPoint> importDataSupplyPointInCSV(String fileName) {
    CsvMapper csvMapper = new CsvMapper();
    CsvSchema schema = CsvSchema.emptySchema().withHeader();
    ObjectReader oReader = csvMapper.readerFor(DataSupplyPoint.class).with(schema);
    ArrayList<DataSupplyPoint> dataSupplyPointList = new ArrayList<>();
    
    try(Reader reader = new FileReader(fileName + ".csv")) {
        MappingIterator<DataSupplyPoint> mi = oReader.readValues(reader);
        
        while (mi.hasNext()) {
            DataSupplyPoint current = mi.next();
            dataSupplyPointList.add(current);
        }
        return dataSupplyPointList;
    } catch (IOException e) {
        e.printStackTrace();
        return dataSupplyPointList;
    }       
}

这让我犯了这个错误:

原因:com.fasterxml.jackson.databind.exc.MismatchedInputException:无法构造user.SupplyPoint的实例(尽管至少存在一个Creator):没有字符串参数构造函数/工厂方法可以从字符串值反序列化('012345678912345678 ')'''

这是我的第一篇文章,我保证会改进啊哈

【问题讨论】:

  • 您是否尝试过在网络上搜索“com.fasterxml.jackson.databind.exc.MismatchedInputException:无法构造实例”?我相信如果你把它放到你喜欢的搜索引擎中,你会发现一些关于你做错了什么的线索。如果您搜索堆栈溢出,您甚至可能会找到解决方案:)
  • 欢迎来到这个网站。这里显示代码的首选方式是使用文本,而不是图像。这使人们可以更轻松地复制和粘贴它并重现您的问题。
  • 是的,我有@Gavin。如果我最终决定发帖,那是因为我没有找到解决方案,而我事先寻找了解决方案:/我现在感觉很糟糕
  • 谢谢@ThomasFritsch :)

标签: java csv import jackson


【解决方案1】:

DataSupplyPointJackson类的构造函数中不知道 哪个 CSV 列对应于哪个构造函数参数。 Jackson 无法从构造函数参数的 Java 名称中弄清楚这一点。 因此,您需要通过注释参数来明确地告诉它 @JsonProperty:

public DataSupplyPoint(@JsonProperty("date") String date,
                       @JsonProperty("value") double value,
                       @JsonProperty("supplyPoint") SupplyPoint supplyPoint) {
    super();
    this.date = date;
    this.value = value;
    this.supplyPoint = supplyPoint;
}

另见javadoc of @JsonCreator

注意:注释创建者方法(构造函数、工厂方法)时,方法必须是:

  • 单参数构造函数/工厂方法,参数没有JsonProperty 注释: 如果是这样,这就是所谓的“委托创建者”,在这种情况下,杰克逊首先绑定 JSON 转换成参数的类型,然后调用 creator。这经常结合使用 带有JsonValue(用于序列化)。
  • 构造函数/工厂方法,其中每个参数 都使用JsonProperty 进行注释 或JacksonInject,表示要绑定的属性名称

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-13
    • 2016-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-18
    • 1970-01-01
    相关资源
    最近更新 更多