MappingJacksonJsonView返回顶级json对象

ltf*_*hie 5 spring-mvc jackson

我转换为控制器使用ContentNegotiatingViewResolver而不是MessageConverters来支持多种输出类型.使用json,我使用MappingJacksonJsonView:

<bean
    class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
    <property name="order" value="1" />
    <property name="mediaTypes">
        <map>
            <entry key="html" value="text/html"/>
            <entry key="json" value="application/json" />
            <entry key="xml" value="application/xml" />
        </map>
    </property>
    <property name="defaultViews">
        <list>
            <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />
            <bean class="org.springframework.web.servlet.view.xml.MarshallingView">
                <constructor-arg>
                    <bean class="org.springframework.oxm.xstream.XStreamMarshaller" />
                </constructor-arg>
            </bean>                         
        </list>
    </property>
    <property name="ignoreAcceptHeader" value="true" />
    <property name="defaultContentType" value="application/json" />
</bean>
Run Code Online (Sandbox Code Playgroud)

使用以下控制器逻辑:

@RequestMapping(value = "/id/{id}", method = RequestMethod.GET)
public ModelAndView getById(@PathVariable (value="id") String id) {
    MyObject ret = doGetById(id);
    ModelAndView modelAndView = new ModelAndView("common/single");
    modelAndView.addObject("myObject", ret);
    return modelAndView;
}
Run Code Online (Sandbox Code Playgroud)

访问/id/1234.json时json返回的内容如下:

{
   myObject: {
        field1:"abc",
        field2:"efg"
   }
}
Run Code Online (Sandbox Code Playgroud)

有没有办法让我将myObject设置为结果的顶级节点,所以它看起来像这样:

{
    field1:"abc",
    field2:"efg"
}
Run Code Online (Sandbox Code Playgroud)

dig*_*oel 8

发生了什么是Spring MVC正在使用ModelAndView并将其序列化为JSON.由于ModelAndView看起来就像一张地图,在这种情况下,地图中只有一个条目,其名称为myObject,这就是JSON响应所看到的内容.为了获得您的对象,您需要只返回您的对象而不是ModelAndView,并让Jackson将您的对象序列化为JSON.

而不是返回ModelAndView,返回一个MyObject并用方法注释该方法@ResponseBody,因此您的控制器方法变为

@RequestMapping(value="/id/{id}", method=RequestMethod.GET, produces="application/json")
public @ResponeBody MyObject getById(@PathVariable (value="id") String id) {
    return doGetById(id);
}
Run Code Online (Sandbox Code Playgroud)