jackson序列化视图:嵌套对象

时间:2017-02-27 13:07:40

标签: java json spring-mvc spring-boot jackson

以下是基于Spring Boot 1.3的项目的片段。 Json序列化是通过Jackson 2.6.3进行的。

我有以下Spring MVC控制器:

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

返回的Results如下(删除了getter和setter):

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

Account类如下(删除了getter和setter):

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属性的json对象数组。
我怀疑这是因为{{1} data中的}属性未使用APIResults< T >进行注释,但不应在所有视图(doc)中包含未注释的属性吗? 有没有办法得到我想要的东西而不将@JsonView注释添加到@JsonView(这不是一个选项)。
我知道我可以使用Jackson mixin来获得我想要的功能,但有没有办法使用Json视图呢?

1 个答案:

答案 0 :(得分:1)

你是对的,春天MVC Jackson2ObjectMapperBuilder has been improved将杰克逊映射器功能DEFAULT_VIEW_INCLUSION设置为false,因此未注释的属性data未被序列化。 / p>

要启用此功能,请使用以下配置(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>

使用此配置,您在使用id视图时会将innerNameViewA属性序列化:

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

此外,您可以通过向其中添加一些其他视图注释来设法隐藏innerName