在Spring MVC中使用@JsonView

我正在使用以下bean定义来使我的spring应用程序在JSON中进行通信

 

这个消息转换器bean是否可以使用@JsonView注释?

从v1.4开始,Jackson JSON处理器已经支持 @JsonView

新编辑:针对Jackson 1.9.12更新

根据v1.8.4 文档 ,我使用writeValueUsingView的函数现在已经过时 使用ObjectMapper.viewWriter(java.lang.Class)而不是 ……但是自1.9以来它也被弃用了 ,而是使用writerWithView(Class)代替 ! (见v1.9.9 文件 )

所以这是一个更新的例子,使用Spring 3.2.0和Jackson 1.9.12进行测试,它只返回{id: 1}而不是扩展{name: "name"}因为它使用.writerWithView(Views.Public.class) 。 切换到Views.ExtendPublic.class将导致{"id":1,"name":"name"}

 package com.demo.app; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.codehaus.jackson.map.annotate.JsonView; import org.codehaus.jackson.map.ObjectMapper; import org.codehaus.jackson.map.ObjectWriter; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @Controller public class DemoController { private final ObjectMapper objectMapper = new ObjectMapper(); @RequestMapping(value="/jsonOutput") @ResponseBody public String myObject(HttpServletResponse response) throws IOException { ObjectWriter objectWriter = objectMapper.writerWithView(Views.Public.class); return objectWriter.writeValueAsString(new MyObject()); } public static class Views { static class Public {} static class ExtendPublic extends Public {} } public class MyObject { @JsonView(Views.Public.class) Integer id = 1; @JsonView(Views.ExtendPublic.class) String name = "name"; } } 

上一个编辑:您需要实例化ObjectMapper并使用自定义视图写出对象,如此处所示,或者在此示例中:

定义视图:

 class Views { static class Public {} static class ExtendedPublic extends PublicView {} ... } public class Thing { @JsonView(Views.Public.class) Integer id; @JsonView(Views.ExtendPublic.class) String name; } 

使用视图:

 private final ObjectMapper objectMapper = new ObjectMapper(); @RequestMapping(value = "/thing/{id}") public void getThing(@PathVariable final String id, HttpServletResponse response) { Thing thing = new Thing(); objectMapper.writeValueUsingView(response.getWriter(), thing, Views.ExtendPublic.class); } 

如果您使用Jackson> = 1.7,您可能会发现@JSONFilter更适合您的需求。

Spring上不支持@JsonView注释,但这个问题已经解决了!
跟着这个

添加对Jackson序列化视图的支持

Spring MVC现在支持Jackon的序列化视图,用于从不同的控制器方法(例如详细页面与摘要视图)呈现相同POJO的不同子集。 问题:SPR-7156

这是SPR-7156 。

状态:已解决

描述

Jackson的JSONView注释允许开发人员控制方法的哪些方面是序列化的。 在当前实现中,必须使用Jackson视图编写器,但是内容类型不可用。 如果作为RequestBody注释的一部分,可以更好地指定JSONView。

在Spring ver> = 4.1时可用

谢谢spring!