Пользовательская сериализация для CSV с помощью Jackson

#java #csv #jackson #fasterxml

#java #csv #джексон #fasterxml

Вопрос:

Итак, представьте, что у меня есть следующие классы Java:

 public class A {
    @JsonProperty("id")
    String id;

    @JsonProperty("name")
    String name;

    @JsonSerialize(using = PropertiesSerializer.class)
    @JsonUnwrapped
    Properties properties;
}

public class Properties {
    List<Property> properties;
}

public class Property {
    String key;
    String value;
}

class PropertiesSerializer extends JsonSerializer<Properties> {
    @Override
    public void serialize(Properties properties, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) {
        if (properties != null amp;amp; properties.getProperties() != null) {
            properties.getProperties().forEach(property -> {
                try {
                    jsonGenerator.writeStartObject();
                    jsonGenerator.writeStringField(property.getKey(), property.getValue());
                    jsonGenerator.writeEndObject();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            });
        }
    }
}
  

Что мне здесь нужно, так это сериализовать Product объект в CSV. При попытке запустить ее я получаю CSV generator does not support Object values for properties (nested Objects) ошибку. При добавлении @JsonUnwrappped аннотации к объектам более низкого уровня я все еще застреваю в какой-то момент с той же ошибкой.

Разве это не должно игнорировать все и вызывать пользовательский сериализатор для properties поля? Похоже, что она полностью игнорирует этот метод. Как мне это исправить?

Кстати, я не могу изменить структуру кода из-за преобразования XML.

Спасибо,

Ответ №1:

В настоящее время json, который генерирует ваш код, выглядит примерно так:

 {
    "id": "myId",
    "name": "myName",
    {
        "foo": "bar"
    },
    {
        "foo2": "bar2"
    },
    ...
}
  

Я думаю, вам просто не хватает jsonGenerator.writeArrayFieldStart("properties") перед циклом и jsonGenerator.writeEndArray() после цикла.