27

我有一个类需要使用杰克逊反序列化,并且该类具有一个集合属性。集合为空,但不为空。问题:如何在没有空集合的情况下反序列化类。下面的示例代码:

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

如果

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

然后除了 json 将是:

{name: "hello"}

不是

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

怎么做?谢谢~~

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

我已经通过 n1ckolas 的建议解决了这个问题。先谢谢你。我的jackson版本是2.1.1,Spring-3.2.2对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>
4

7 回答 7

57

您可以在您的班级或归档中使用 @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
}
于 2017-10-18T09:15:31.423 回答
13

如果您可以使用 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
于 2013-03-15T09:21:01.447 回答
6

如果您使用的是 Spring Boot,只需添加application.properties以下内容:

spring.jackson.serialization-inclusion=NON_EMPTY
于 2016-08-12T15:51:02.960 回答
5

使用此注释 @JsonInclude(JsonInclude.Include.NON_EMPTY)

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

从文档

指示仅具有空值的属性或被视为空的属性不包括在内的值。

于 2019-08-08T12:08:40.583 回答
3

Spring boot 会自动从 application.properties 中选择属性,您可以添加以下属性:

spring.jackson.serialization.write-empty-json-arrays=false
于 2018-09-19T18:42:39.290 回答
1
  1. 您可以使用 JSON 视图,如下所示:Jackson - 动态抑制属性的序列化(写入)

  2. 另一种方法是定义另一个类,几乎与 类似Person,但没有events属性。然后根据集合的值,您可以决定序列化原始Person对象或替代的events-less 对象。恕我直言,这更简单,应该适用于上述情况,但不如第一种选择灵活。

于 2013-03-15T09:15:32.670 回答
0

@JsonInclude(JsonInclude.Include.NON_EMPTY) 在班级级别包含此内容,将执行以下操作。

  1. 仅包含非空值
  2. 仅包括非空列表
于 2020-03-03T09:07:13.130 回答