在Spring MVC中使用@JsonView

Eri*_*rik 8 java spring json spring-mvc java-ee

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

<bean id="jacksonMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" />
Run Code Online (Sandbox Code Playgroud)

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

and*_*dyb 18

@JsonView已经支持在杰克逊JSON处理器从V1.4开始.

新编辑:针对Jackson 1.9.12更新

按照v1.8.4 文档我所用的功能writeValueUsingView现在已过时 使用ObjectMapper.viewWriter(java.lang.Class中),而不是 ......不过这也被弃用 自1.9,使用writerWithView(类),而不是!(见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";
    }
}
Run Code Online (Sandbox Code Playgroud)

上一页编辑:您需要实例化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;
}
Run Code Online (Sandbox Code Playgroud)

使用视图:

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);
}
Run Code Online (Sandbox Code Playgroud)

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


Geo*_*lou 7

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

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

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

这是SPR-7156.

状态:已解决

描述

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

可在Spring ver> = 4.1上获得

谢谢春天!