парсеры univocity имеет аннотацию @Nested
, которую вы можете использовать:
Попробуйте:
public static class User {
@Parsed
String name;
@Parsed
String gender;
@Nested
Address address;
@Parsed
long number;
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", gender='" + gender + '\'' +
", address=" + address +
", number=" + number +
'}';
}
}
public static class Address {
@Parsed(field = "address_first_line")
String firstLine;
@Parsed(field = "address_second_line")
String secondLine;
@Override
public String toString() {
return "Address{" +
"firstLine='" + firstLine + '\'' +
", secondLine='" + secondLine + '\'' +
'}';
}
}
public static void main(String ... args){
StringReader input = new StringReader(
"name,gender,address_first_line,address_second_line, city,number\n" +
"John,M,Somewhere,Else,City,1");
for(User user : new CsvRoutines().iterate(User.class, input)){
System.out.println(user.toString());
}
}
Вывод:
User{name='John', gender='M', address=Address{firstLine='Somewhere', secondLine='Else'}, number=1}
Если вам не нравятся аннотации, вы можете сопоставить вещи вручную:
CsvRoutines routines = new CsvRoutines();
ColumnMapper mapper = routines.getColumnMapper();
mapper.attributeToColumnName("name", "name");
mapper.attributeToColumnName("gender", "gender");
mapper.attributeToColumnName("number", "number");
mapper.attributeToColumnName("address.firstLine", "address_first_line");
mapper.attributeToColumnName("address.secondLine", "address_second_line");
for (User user : routines.iterate(User.class, input)) {
System.out.println(user.toString());
}
Надеюсь, это поможет.
Отказ от ответственности: я являюсь автором этой библиотеки.Это с открытым исходным кодом и бесплатно (лицензия Apache 2.0)