Джексон сериализовать в JSON, исключая тип - PullRequest
2 голосов
/ 02 января 2012

Я использую hibernate для ленивого извлечения контента из базы данных. Затем этот контент сериализуется в вывод json, проблема в том, что Джексон вызывает геттеры для «persistentBag», который я получаю из hibernate, и заканчивается исключением «нет сеанса или сеанс был закрыт».

На самом деле я хотел бы сказать Джексону "если список не загружен (значит, если это постоянный пакет), то не сериализуйте его"

Каков наилучший способ достичь этого? Какой-нибудь джексонский конфиг, чтобы исключить persistentBag из сериализации? Должен ли я использовать отражающий API для установки persistentBag в новый пустой список?

Что лучше? Спасибо и с новым годом ребята!

Ответы [ 2 ]

0 голосов
/ 02 января 2012

Я бы сначала посмотрел на модуль Jackson Hibernate , поскольку он добавляет поддержку некоторых специфичных для Hibernate вещей, таких как обработка отложенной загрузки.Его также можно расширить, чтобы разрешить отключение вывода для еще не загруженных коллекций, поскольку он уже знает, как выполнять отложенную загрузку коллекций, если это необходимо.

Кроме того, в целом вы можете предотвратить вывод пустых коллекций с помощьюиспользуя

@JsonSerialize(include=JsonSerialize.Inclusion.NON_EMPTY)

, который добавит соответствующее свойство, если и только если у него есть хотя бы один элемент.

0 голосов
/ 02 января 2012

Вы можете попробовать использовать @JsonIgnore, чтобы полностью игнорировать помеченное свойство.С точки зрения аннотации, я не думаю, что есть опция «if lodaded».

Конечно, вы могли бы написать собственный маршаллер, который проверяет тип и решает, как поступить.

Я, например, написал сериализатор для пользовательского типа данных

public class PropertyValueSerializer extends JsonSerializer<PROPERTY_VALUE> {

    @Override
    public void serialize(PROPERTY_VALUE property_value, JsonGenerator jsonGenerator,
                          SerializerProvider serializerProvider) throws IOException, JsonProcessingException {

        jsonGenerator.writeStartObject();
        jsonGenerator.writeFieldName(property_value.getKey());
        jsonGenerator.writeString(property_value.getValue());
        jsonGenerator.writeEndObject();
    }
}

, который затем используется для сериализации этого типа путем добавления некоторых аннотаций:

@JsonSerialize(using = PropertyValueSerializer.class)
@JsonDeserialize(using = PropertyValueDeserializer.class)
public class PROPERTY_VALUE implements Serializable{

    private String key;
    private String value;

Этот пользовательскийСериализатор дает вам полный контроль, но, конечно, немного больше работы, чем простая аннотация.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...