Не возвращайте свойство, когда он пустой список с jackson

У меня класс должен быть десриализован с использованием jackson, а класс имеет свойство collection. Коллекция пуста, но не null. Вопрос: Как десерциализировать класс без пустой коллекции. Пример кода ниже:

class Person
{
    String name;
    List<Event> events;
    //....getter, setter
}

если

person.list = new List<Event>(); 
persion.name = "hello";

то исключение json будет:

{name: "hello"}

not

{name: "hello", events:[]}

Как это сделать? Спасибо ~~

=============================================== =

Я решил это советом n1ckolas. Благодарю вас первым. Моя версия Jackson 2.1.1, и Spring -3.2.2 импортировать лучшую поддержку для этого verson of jackson. Кроме того, это работает как для массивов , так и для коллекции. Ниже приведена моя конфигурация:

<!-- Enables the Spring MVC @Controller programming model -->
<mvc:annotation-driven>
    <mvc:message-converters>
        <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
            <property name="objectMapper" ref="objectMapper"/>
        </bean>
    </mvc:message-converters>        
</mvc:annotation-driven>

<!--Json Mapper-->
<bean name="objectMapper" class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean" autowire="no">
    <property name="featuresToDisable">
        <list>
            <!--not to return empty colletion-->
            <value type="com.fasterxml.jackson.databind.SerializationFeature">WRITE_EMPTY_JSON_ARRAYS</value>
        </list>
    </property>
</bean>

Ответ 1

Если вы можете изменить свою оригинальную модель с помощью аннотаций Джексона, вот как это сделать.

У Джексона WRITE_EMPTY_JSON_ARRAYS. И вы можете отключить его с помощью:

objectMapper.configure(SerializationConfig.Feature.WRITE_EMPTY_JSON_ARRAYS, false);

Но он работает только для Arrays, но не для Collections. Но вы можете комбинировать @JsonProperty с @JsonIgnore, что-то вроде следующего:

//....getter, setter of Person class
@JsonIgnore
public List<Event> getEvents() {
    return events;
}

@JsonProperty("events")
public Event[] getEventsArr() {
    return events.toArray(new Event[0]);
}

И после этого вы будете выводить, как и ожидалось.

EDIT. Если вы используете SpringMVC, вы можете настроить фактический ObjectMapper с явным ссылкой в ​​mvc:annotation-driven:

<!-- Configures the @Controller programming model -->
<mvc:annotation-driven>
    <mvc:message-converters>
        <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
            <property name="objectMapper" ref="objectMapper"/>
        </bean>
    </mvc:message-converters>
</mvc:annotation-driven>

<!--custom Json Mapper configuration-->
<bean name="objectMapper" class="org.springframework.http.converter.json.JacksonObjectMapperFactoryBean" autowire="no">
    <property name="featuresToDisable">
        <list>
            <!--Ignore unknown properties-->
            <value type="org.codehaus.jackson.map.SerializationConfig.Feature">WRITE_EMPTY_JSON_ARRAYS</value>
        </list>
    </property>
</bean>

Offtop: обычно полезно указать явный экземпляр ObjectMapper, потому что:

  • вы можете настроить его так, как хотите.
  • вы можете использовать его ссылку через @Autowired

Ответ 2

Вы можете использовать аннотацию @JsonInclude (JsonInclude.Include.NON_EMPTY) в своем классе или зарегистрированную.

import com.fasterxml.jackson.annotation.JsonInclude;
@JsonInclude(JsonInclude.Include.NON_EMPTY)
class Person
{
    String name;
    List<Event> events;
    //....getter, setter
}

Ответ 3

Если вы используете Spring Boot, просто добавьте в свой application.properties следующее:

spring.jackson.serialization-inclusion=NON_EMPTY

Ответ 4

Spring boot автоматически выбирает свойство из application.properties Вы можете добавить ниже свойство:

spring.jackson.serialization.write-empty-json-arrays=false

Ответ 5

  • Вы можете использовать JSON View, как здесь: Джексон - подавление динамических свойств (записи) динамических данных

  • Другой способ сделать это - определить другой класс, почти похожий на Person, но без свойства events. Затем, основываясь на значении коллекций, вы можете решить сериализовать исходный объект Person или альтернативный объект events -less. Это ИМХО проще и должно работать для вашего случая выше, но не так гибко, как первая альтернатива.

Ответ 6

Используйте эту аннотацию @JsonInclude(JsonInclude.Include.NON_EMPTY)

@JsonInclude(JsonInclude.Include.NON_EMPTY)
person.list = new List<Event>(); 

из документации

Значение, которое указывает, что только свойства с нулевым значением или что считается пустым, не должны быть включены.