-
-
Notifications
You must be signed in to change notification settings - Fork 152
Open
Description
I have written a short test class to identify a problem I am encountering when attempting to convert a POJO to a JSON String.
NOTE that in my Java code I tried to configure the CsvMapper v2.18.3 to ignore certain types of problems but the Exception is still thrown.
Dependency:
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-csv</artifactId>
<version>2.18.3</version>
</dependency>
The Java code is:
package ca.cdr.admin.web.controller;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.dataformat.csv.CsvMapper;
import com.fasterxml.jackson.dataformat.csv.CsvParser;
import com.fasterxml.jackson.dataformat.csv.CsvSchema;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Collection;
import java.util.HashSet;
public class JacksonCsvSerializationTest {
@JsonIgnoreProperties(ignoreUnknown=true)
private static class Name {
private String firstName;
private String lastName;
public Name(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
@JsonProperty("name")
public String getName() {
return this.firstName + " " + this.lastName;
}
}
@JsonIgnoreProperties(ignoreUnknown=true)
private static class Person {
@JsonProperty("id")
private int id = 1;
@JsonProperty("names")
private Collection<Name> names = new HashSet<Name>();
public Person(Name name) {
this.names.add(name);
}
}
public static void main(String args[]) throws IOException {
Name name = new Name("first", "last");
Person person = new Person(name);
CsvSchema.Builder csvBuilder = new CsvSchema.Builder();
CsvMapper csvMapper = (CsvMapper) new CsvMapper()
.configure(CsvParser.Feature.FAIL_ON_MISSING_COLUMNS, false)
.configure(CsvParser.Feature.FAIL_ON_MISSING_HEADER_COLUMNS, false)
.configure(JsonParser.Feature.IGNORE_UNDEFINED, true)
.configure(JsonGenerator.Feature.IGNORE_UNKNOWN, true);
csvBuilder.addColumn(new CsvSchema.Column(1, "id"));
csvBuilder.addColumn(new CsvSchema.Column(2, "names"));
CsvSchema csvSchema = csvBuilder.build().withStrictHeaders(false);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
csvMapper.writer(csvSchema).writeValue(baos, person);
System.out.println("-->" + baos.toString() + "<--");
}
}
The ERROR I get is:
Exception in thread "main" com.fasterxml.jackson.dataformat.csv.CsvWriteException: CSV generator does not support Object values for properties (nested Objects) (through reference chain: ca.cdr.admin.web.controller.JacksonCsvSerializationTest$Person["names"]->java.util.HashSet[0])
at com.fasterxml.jackson.dataformat.csv.CsvWriteException.from(CsvWriteException.java:25)
at com.fasterxml.jackson.dataformat.csv.CsvGenerator._reportMappingError(CsvGenerator.java:1108)
at com.fasterxml.jackson.dataformat.csv.CsvGenerator.writeStartObject(CsvGenerator.java:648)
at com.fasterxml.jackson.core.base.GeneratorBase.writeStartObject(GeneratorBase.java:328)
at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:179)
at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serializeContents(CollectionSerializer.java:145)
at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:107)
at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:25)
at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:732)
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:770)
at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:183)
at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider._serialize(DefaultSerializerProvider.java:502)
at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:341)
at com.fasterxml.jackson.databind.ObjectWriter$Prefetch.serialize(ObjectWriter.java:1574)
at com.fasterxml.jackson.databind.ObjectWriter._writeValueAndClose(ObjectWriter.java:1275)
at com.fasterxml.jackson.databind.ObjectWriter.writeValue(ObjectWriter.java:1098)
at ca.cdr.admin.web.controller.JacksonCsvSerializationTest.main(JacksonCsvSerializationTest.java:62)
Any assistance would be appreciated!
Metadata
Metadata
Assignees
Labels
No labels