Skip to content

CSV generator does not support Object values for properties (nested Objects) #556

@KevinDougan

Description

@KevinDougan

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

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions