使用opencv抛出异常将字符串转换为pojo class
Converting string into pojo class using opencv throwing exception
我需要将我的 http 响应转换为模型,我的响应是纯 csv 格式:
try {
StringReader stringReader = new StringReader(string);
CSVReader csvReader = new CSVReaderBuilder(stringReader).build();
CsvToBean<SampleModel> csvToBean = new CsvToBeanBuilder<SampleModel>(csvReader)
.withType(SampleModel.class)
.withIgnoreLeadingWhiteSpace(true)
.build();
arrayList =(ArrayList<SampleModel>)csvToBean.parse();
} catch (Exception e) {
System.out.println(e.getMessage());
}
它抛出异常:
Error capturing CSV header!
字符串如下所示:
Name, Date
Alex, 2012-10-30
Borhan, 2012-11-05
我一直在关注这里的作品:https://sourceforge.net/p/opencsv/bugs/196/#ee18
如果您有一个或多个带参数的构造函数,请在 bean 中显式创建一个无参数构造函数 class。如果您没有一个或多个带参数的构造函数,则无需显式创建无参数构造函数。
SampleModel.java:
import com.opencsv.bean.CsvBindByName;
public class SampleModel {
@CsvBindByName(column = "Name")
private String name;
@CsvBindByName(column = "Date")
private String date;
public SampleModel() {
// Empty
}
public SampleModel(String name, String date) {
this.name = name;
this.date = date;
}
public void setName(String name) {
this.name = name;
}
public void setDate(String date) {
this.date = date;
}
@Override
public String toString() {
return "{" + name + ", " + date + "}";
}
}
如您所见,我有一个双参数构造函数,因此我需要显式提供一个无参数构造函数。如果删除无参数构造函数和 运行 Main.java
(如下所示),它将在 运行 时失败。
但是,下面的 bean 定义不需要显式的无参数构造函数。你可以用这个定义再运行ning Main.java
验证一下
import com.opencsv.bean.CsvBindByName;
public class SampleModel {
@CsvBindByName(column = "Name")
private String name;
@CsvBindByName(column = "Date")
private String date;
public void setName(String name) {
this.name = name;
}
public void setDate(String date) {
this.date = date;
}
@Override
public String toString() {
return "{" + name + ", " + date + "}";
}
}
Main.java:
import java.io.StringReader;
import java.util.List;
import com.opencsv.CSVReader;
import com.opencsv.CSVReaderBuilder;
import com.opencsv.bean.CsvToBeanBuilder;
public class Main {
public static void main(String[] args) {
String string = "Name, Date\n" +
"Alex, 2012-10-30\n" +
"Borhan, 2012-11-05";
try {
StringReader stringReader = new StringReader(string);
CSVReader csvReader = new CSVReaderBuilder(stringReader).build();
List<SampleModel> arrayList= new CsvToBeanBuilder<SampleModel>(csvReader)
.withType(SampleModel.class)
.withIgnoreLeadingWhiteSpace(true)
.withSkipLines(1)// Skip the header line
.build()
.parse();
System.out.println(arrayList);
} catch (Exception e) {
e.printStackTrace();
}
}
}
输出:
[{Alex, 2012-10-30}, {Borhan, 2012-11-05}]
原回答:
解决方法是从您从 CSV 中读取的每条记录创建一个 bean 实例,并将该实例添加到 List
,如下所示:
List<SampleModel> arrayList = new ArrayList<>();
String[] nextRecord;
CSVReader csvReader = new CSVReaderBuilder(stringReader)
.withSkipLines(1)// Skip the header line
.build();
while ((nextRecord = csvReader.readNext()) != null) {
arrayList.add(new SampleModel(nextRecord[0], nextRecord[1]));
}
我需要将我的 http 响应转换为模型,我的响应是纯 csv 格式:
try {
StringReader stringReader = new StringReader(string);
CSVReader csvReader = new CSVReaderBuilder(stringReader).build();
CsvToBean<SampleModel> csvToBean = new CsvToBeanBuilder<SampleModel>(csvReader)
.withType(SampleModel.class)
.withIgnoreLeadingWhiteSpace(true)
.build();
arrayList =(ArrayList<SampleModel>)csvToBean.parse();
} catch (Exception e) {
System.out.println(e.getMessage());
}
它抛出异常:
Error capturing CSV header!
字符串如下所示:
Name, Date
Alex, 2012-10-30
Borhan, 2012-11-05
我一直在关注这里的作品:https://sourceforge.net/p/opencsv/bugs/196/#ee18
如果您有一个或多个带参数的构造函数,请在 bean 中显式创建一个无参数构造函数 class。如果您没有一个或多个带参数的构造函数,则无需显式创建无参数构造函数。
SampleModel.java:
import com.opencsv.bean.CsvBindByName;
public class SampleModel {
@CsvBindByName(column = "Name")
private String name;
@CsvBindByName(column = "Date")
private String date;
public SampleModel() {
// Empty
}
public SampleModel(String name, String date) {
this.name = name;
this.date = date;
}
public void setName(String name) {
this.name = name;
}
public void setDate(String date) {
this.date = date;
}
@Override
public String toString() {
return "{" + name + ", " + date + "}";
}
}
如您所见,我有一个双参数构造函数,因此我需要显式提供一个无参数构造函数。如果删除无参数构造函数和 运行 Main.java
(如下所示),它将在 运行 时失败。
但是,下面的 bean 定义不需要显式的无参数构造函数。你可以用这个定义再运行ning Main.java
验证一下
import com.opencsv.bean.CsvBindByName;
public class SampleModel {
@CsvBindByName(column = "Name")
private String name;
@CsvBindByName(column = "Date")
private String date;
public void setName(String name) {
this.name = name;
}
public void setDate(String date) {
this.date = date;
}
@Override
public String toString() {
return "{" + name + ", " + date + "}";
}
}
Main.java:
import java.io.StringReader;
import java.util.List;
import com.opencsv.CSVReader;
import com.opencsv.CSVReaderBuilder;
import com.opencsv.bean.CsvToBeanBuilder;
public class Main {
public static void main(String[] args) {
String string = "Name, Date\n" +
"Alex, 2012-10-30\n" +
"Borhan, 2012-11-05";
try {
StringReader stringReader = new StringReader(string);
CSVReader csvReader = new CSVReaderBuilder(stringReader).build();
List<SampleModel> arrayList= new CsvToBeanBuilder<SampleModel>(csvReader)
.withType(SampleModel.class)
.withIgnoreLeadingWhiteSpace(true)
.withSkipLines(1)// Skip the header line
.build()
.parse();
System.out.println(arrayList);
} catch (Exception e) {
e.printStackTrace();
}
}
}
输出:
[{Alex, 2012-10-30}, {Borhan, 2012-11-05}]
原回答:
解决方法是从您从 CSV 中读取的每条记录创建一个 bean 实例,并将该实例添加到 List
,如下所示:
List<SampleModel> arrayList = new ArrayList<>();
String[] nextRecord;
CSVReader csvReader = new CSVReaderBuilder(stringReader)
.withSkipLines(1)// Skip the header line
.build();
while ((nextRecord = csvReader.readNext()) != null) {
arrayList.add(new SampleModel(nextRecord[0], nextRecord[1]));
}