convert composite java object to CSV
Asked Answered
P

1

5

I have an object, say Response.java that looks like the following:

class Response
{
   private User user;  // has firstName, lastName, age etc.
   private Address address; // has city, state, country etc.
   private OrderInfo orderInfo;  // has orderNumber, orderDate etc.

   // constuctors, getters/setters follow

}

I need to convert a List of these objects into csv, so my end goal is something like:

firstName, lastName, age, city, state, country, latitude, orderNumber, orderDate
john, doe, 25, dallas, tx, usa, somelat, 101, 08/17/2015
jane, doe, 21, atlant, ga, usa, somelat, 102, 08/15/2015

I tried to use two libraries - jackson (csv dataformat), org.json (JsonArray), but i couldn't get the desired result.

This is my jackson csv code:

Response response = getResponse();
final CsvMapper mapper = new CsvMapper();
final CsvSchema schema = mapper.schemaFor(Response.class);
final String csv = mapper.writer(schema).writeValueAsString(response);

With Jackson, i am getting

com.fasterxml.jackson.core.JsonGenerationException: CSV generator does not support Object values for properties

Is there a way to convert the composite object into csv in the way i need (just the fields without the json like grouping)?

Pericline answered 18/8, 2015 at 23:55 Comment(6)
Are you using the Jackson CSV library? If not, details are here on how to implement: github.com/FasterXML/jackson-dataformat-csvDoner
Did you try overridng the toString method of Response class? I think by using it you can get the desired result.Keating
We don't really need to see the bean class. We need to see how you're using Jackson to perform the serialization. It's producing JSON, not CSV.Floating
@Floating - I've updated my question with my jackson code and jackson error message (The json output was necause i also tried to do shemaFor(json)Pericline
@ColimMc - yes, i am using jackson csv libraryPericline
@Raj Sharma - yes, the toString() is overriden to print the values as you implied,Pericline
D
12

So I ran similar code that you are using in a test project and it looks like you will need to use @JsonUnwrapped on all your objects (User, Address, and OrderInfo).

Jackson CSV doesn't support objects as properties which is why you got that exception. Here is the issue on Github: Jackson CSV Object properties issue

Here is sample code I used to verify this:

Test response = new Test();
response.setNum(1);
Stub s = new Stub();
s.setAge("12");
s.setName("Colin");
response.setS(s);
final CsvMapper mapper = new CsvMapper();
final CsvSchema schema = mapper.schemaFor(Test.class);
final String csv = mapper.writer(schema.withUseHeader(true)).writeValueAsString(response);
System.out.println(csv);

Output from the above code was the following:

num,age,name
1,12,Colin
Doner answered 19/8, 2015 at 23:0 Comment(1)
Thanks for pointing me to the issue, it worked with @JsonUnwrapped.Pericline

© 2022 - 2024 — McMap. All rights reserved.