杰克逊序列化视图:嵌套对象



以下是基于Spring Boot 1.3的项目的摘要。JSON序列化是通过Jackson 2.6.3进行的。

我有以下弹簧MVC控制器:

@RequestMapping(value = "/endpoint", method = RequestMethod.GET, produces=MediaType.APPLICATION_JSON_VALUE)
public Results<Account> getAllAccounts() throws Exception {
    return service.getAllAccounts();
}

返回的Results如下(删除了Getters和Setters):

public class APIResults<T> {
    private Collection<T> data;
}

Account类如下(删除Getters和Setters):

public class Account {
    @JsonView(Views.ViewA.class)
    private Long id;
    @JsonView(Views.ViewB.class)
    private String name;
    private String innerName;
}

我也有以下JSON视图

public class Views {
    public interface ViewA {}
    public interface Publisher extends ViewB {}
}


动机是基于某些预测,从同一控制器返回不同的视图。
因此,我正在使用AbstractMappingJacksonResponseBodyAdvice在运行时设置视图。设置bodyContainer.setSerializationView(Views.ViewA.class)时,我会得到一个空的JSON结果,而不是仅包含id属性的对象。
我怀疑这是因为APIResults< T >中的data属性未用@JsonView注释注释的属性包括所有视图(DOC)?
有没有办法在不将@JsonView注释添加到APIResults< T >的情况下获得我想要的东西(这不是一个选项)。
我知道我可以使用Jackson Mixin来获得我想要的功能,但是有没有办法使用JSON视图?

您是对的,Spring MVC Jackson2ObjectMapperBuilder已改进以将Jackson Mapper功能DEFAULT_VIEW_INCLUSION设置为 false,因此不序列化的属性data未被序列化。

要启用该功能,请使用以下配置(XML):

<mvc:annotation-driven>
    <mvc:message-converters>
        <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
            <property name="objectMapper">
                 <bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
                   <property name="defaultViewInclusion" value="true"/>
                 </bean>
            </property>
        </bean>
    </mvc:message-converters>
</mvc:annotation-driven>

使用此配置,您将使用idinnerName使用ViewA视图时序列化的属性:

{"data":[
  {"id":1,"innerName":"one"},
  {"id":2,"innerName":"two"},
  {"id":3,"innerName":"three"}
]}

此外,您还可以通过向其添加其他视图注释来隐藏innerName

最新更新