FasterXML / FasterXML/jackson-dataformats-text

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

Abierto
#556 3 comentarios 0 reacciones 0 asignados Ver en GitHub
csv
Lenguaje dominante
Java
Estrellas
455
Forks
164
Merge medio
6 d 10 h
PR fusionados (30 d)
2

Descripción

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:
```

com.fasterxml.jackson.dataformat
jackson-dataformat-csv
2.18.3

```

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 names = new HashSet();

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!

Guía de contribución

No hay ninguna guía de contribución indexada para este repositorio

Evaluación

Este issue todavía no se ha evaluado.

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.