Не возвращайте свойство, когда он пустой список с 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>();
из документации
Значение, которое указывает, что только свойства с нулевым значением или что считается пустым, не должны быть включены.