我有一个类需要使用jackson进行反序列化,并且该类具有集合属性。该集合为空,但不为null。 问题:如何在没有空集合的情况下对类进行定理。示例代码如下:
class Person
{
String name;
List<Event> events;
//....getter, setter
}
如果
person.list = new List<Event>();
persion.name = "hello";
然后除了json将是:
{name: "hello"}
不是
{name: "hello", events:[]}
如何制作?谢谢~~
=============================================== =
我已经通过n1ckolas的建议解决了这个问题。先谢谢你 我的杰克逊版本是2.1.1,而Spring-3.2.2导入了对杰克逊这个版本的更好支持。此外,这适用于数组和集合。 以下是我的配置:
<!-- 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>
答案 0 :(得分:23)
您可以在班级或归档中使用@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
}
答案 1 :(得分:8)
如果您可以使用Jackson注释更改原始模型,以下是实现此目的的方法。
杰克逊有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]);
}
然后你会按照预期输出。
编辑:如果您使用的是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 :(得分:3)
如果您使用的是Spring Boot,只需在application.properties
中添加以下内容:
spring.jackson.serialization-inclusion=NON_EMPTY
答案 3 :(得分:1)
您可以使用JSON视图,例如:Jackson - suppressing serialization(write) of properties dynamically
另一种方法是定义另一个类,与Person
几乎相似但没有events
属性。然后,根据集合的值,您可以决定序列化原始Person
对象,或替代的events
- less对象。这是恕我直言,并且应该适用于您的情况,但不如第一种选择灵活。
答案 4 :(得分:1)
Spring Boot自动从application.properties中选择属性 您可以添加以下属性:
spring.jackson.serialization.write-empty-json-arrays=false
答案 5 :(得分:1)
使用此注释@JsonInclude(JsonInclude.Include.NON_EMPTY)
@JsonInclude(JsonInclude.Include.NON_EMPTY)
person.list = new List<Event>();
来自文档
该值指示仅具有空值的属性或什么是 被认为是空的,不包括在内。
答案 6 :(得分:0)
@JsonInclude(JsonInclude.Include.NON_EMPTY)在类级别将其包括在内,将完成以下操作。