Я пытаюсь создать файл CSV из довольно сложного объекта Java. Объект представляет собой сеанс с некоторыми атрибутами и списком строк и сообщений, которые, в свою очередь, имеют некоторые атрибуты, и список комментариев, которые имеют некоторые атрибуты.
Класс сеанса выглядит следующим образом;
public class Session {
private Long id;
private Date startDate;
private Date endDate;
private List<Message> messages;
private List<String> participants;
public TweetSession() {
}
public TweetSession(Date startDate, List<Message> messages, List<String> participants) {
this.startDate = startDate;
this.messages = messages;
this.participants = participants;
}
public Long getId() {
return id;
}
public Date getStartDate() {
return startDate;
}
public void setStartDate(Date startDate) {
this.startDate = startDate;
}
public Date getEndDate() {
return endDate;
}
public void setEndDate(Date endDate) {
this.endDate = endDate;
}
public List<Message> getMessages() {
return messages;
}
public void setMessage(List<Message> messages) {
this.message = message;
}
public List<String> getParticipants() {
return participants;
}
public void setParticipants(List<String> participants) {
this.participants = participants;
}
}
Класс сообщения следующий;
public class Message {
private Long id;
private Session session;
private Date date;
private String participant;
private String content;
private List<Comment> comments;
public Message() {
}
public Message(String participant, Session session, Date date, String content) {
this.participant = participant;
this.session = session;
this.content = content;
this.date = date;
this.comments = new ArrayList<>();
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getParticipant() {
return participant;
}
public void setParticipant(String participant) {
this.participant = participant;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public List<Comment> getComments() {
return comments;
}
public void setComments(List<Comment> comments) {
this.comments = comments;
}
public void addComment(Comment comment) {
this.comments.add(comment);
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public TweetSession getSession() {
return session;
}
public void setSession(TweetSession session) {
this.session = session;
}
}
И класс комментариев;
public class Comment {
private Long id;
private Message message;
private String participant;
private String message;
private Date date;
public Comment() {
}
public Comment(String participant, Message message, String content, Date date) {
this.participant = participant;
this.content = content;
this.message = message;
this.date = date;
}
public String getParticipant() {
return participant;
}
public void setParticipant(String participant) {
this.participant = participant;
}
public Message getMessage() {
return message;
}
public void setMessage(Message message) {
this.message = message;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
Мне интересно, можно ли сопоставить это с файлом CSV. Когда я конвертирую объект сеанса в формат JSON и конвертирую этот JSON в CSV в онлайн-генераторе, я получаю правильный вывод, поэтому я думаю, что это должно быть возможно. Я просто не знаю как. Я пробовал использовать библиотеку net.sf.supercsv следующим образом;
public void generateCSV(Session session, HttpServletResponse response) throws IOException {
String csvFileName = "session.csv";
response.setContentType("text/csv");
String headerKey = "Content-Disposition";
String headerValue = String.format("attachment; filename=\"%s\"",
csvFileName);
response.setHeader(headerKey, headerValue);
ICsvBeanWriter csvWriter = new CsvBeanWriter(response.getWriter(),
CsvPreference.STANDARD_PREFERENCE);
// Generate header for the CSV
Field fields[] = session.getClass().getDeclaredFields();
String[] header = new String[fields.length];
for (int i = 0; i < fields.length; i++) {
header[i] = fields[i].getName();
}
csvWriter.writeHeader(header);
// Generate CSV content from data
csvWriter.write(session, header);
csvWriter.close();
}
Но это, конечно, не даст желаемого результата.
Может кто-то указать мне верное направление?
Заранее спасибо,
Нильс
Изменить:
Это пример сеанса в формате JSON:
{
"id": 22,
"startDate": 1447368081000,
"endDate": null,
"messages": [
{
"id": 10,
"date": 1447368159000,
"participant": "1",
"content": "This is a message",
"comments": []
},
{
"id": 11,
"date": 1447368168000,
"participant": "1",
"content": "This is also a message",
"comments": []
},
{
"id": 12,
"date": 1447368179000,
"participant": "1",
"content": "This is another message",
"comments": [
{
"id": 10,
"participant": "1",
"message": "This is a comment",
"date": 1447368227000
},
{
"id": 11,
"participant": "1",
"message": "This is also a comment",
"date": 1447368234000
}
]
}
],
"participants": [
"1",
"23"
]
}
Когда я конвертирую это в CSV, я получаю что-то вроде этого:
Действительно, начинать думать (один) CSV может быть не лучшим подходом к этой проблеме.