在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!