从MVC Controller返回JSON

时间:2014-03-18 11:47:34

标签: json spring-mvc

我试图找出如何设法从Controller返回JSON输出。 目前,我正在返回我的结果并使用freemarker view resolver获取它们。  我的控制器中的代码如下:

 @RequestMapping(value = "query", method = RequestMethod.GET)
public ModelAndView search(
        @RequestParam(required = true) String q
){


    ModelAndView mv = new ModelAndView(getPartial("template"));

    mv.addObject("terms",q.replace(","," "));
    mv.addObject("results",getResultsForQuery(q));

    return mv;
}

以及freemarker的配置:

<!-- freemarker config -->
<bean id="freemarkerConfig"    class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
    <property name="templateLoaderPath" value="/freemarker/"/>
    <property name="freemarkerSettings">
        <props>
            <prop key="locale">en_US</prop>
        </props>
    </property>
</bean>   


<bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
    <property name="order" value="1"/>
    <property name="exposeSpringMacroHelpers" value="true"/>
    <property name="cache" value="false"/>
    <property name="suffix" value=".ftl"/>
    <property name="contentType" value="text/html;charset=UTF-8"/>
</bean>

据我所知,到目前为止,有两种方法可以返回JSON对象,a)通过修改控制器和b)而无需通过更改配置来修改它。 此外,我已阅读有关通过ResponseBody返回JSON但不确定应该更改配置的内容。首先,任何人都可以验证上述结论是否有效,第二个帮助我从这个GET方法返回JSON?

* UPDATE * * 如果我使用ResponseBody和这样的配置:

 <!-- json config -->
<bean id="viewName" class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />

我应该删除freemarker confiuration吗?

提前感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

有几种方法可以返回JSON。我首选的方法是在类路径中包含Jackson库,配置Controller的处理程序方法以返回对象,并将返回标记为@ResponseBody。 Spring MVC将连接所有的点,将响应序列化为JSON,一切都会很好。您甚至可以使用Jackson的注释和/或直接代码来控制序列化的发生方式。

我要考虑的下一个方法是自己序列化为JSON,无论是使用Jackson还是其他一些lib,但你也可以使用StringBuffer和暴力破解。为此,请将返回类型从上面更改为String,在返回时保留@ResponseBody,并可选择删除Jackson库。在这种情况下,您负责生成JSON。由您来确保它的格式良好,因为您为String返回的任何内容都将直接返回给浏览器。您可能还需要更改Content-Type标头以反映您正在返回JSON。

下一种方法是返回ModelAndView或View。我个人不喜欢这样,因为它是一种相当古老的做MVC的方式。但是,它得到了支持,所以我将讨论。在这种情况下,您将创建启用JSON的View对象的实例或其他一些自定义View,并返回该(直接或作为ModelAndView的一部分)。我已经使用此方法返回CSV文件,如果CSV生成失败,我可以选择将用户发送到错误页面,我可以这样做,因为我可以有条件地翻转视图。然而,不是我最喜欢的方法,对我而言,我需要相当多的额外编码。我很懒...起诉我。

选项4:只需拥有一个JSP / Thymeleaf / etc视图,&#34;看起来&#34;像JSON。 JSP不一定必须生成HTML。它只需要解析。从理论上讲,人们可以使用JSTL等输出JSON-esque。不过,我认为这将是一种草率的方式。

可能还有其他一些方法,但我认为这些是我能想到的前4位。我认为,鉴于您无论如何都需要修改代码,第一个选项将是我要使用的选项。使代码看起来很干净,在我看来,人们更容易理解发生了什么。

答案 1 :(得分:0)

您有几个选择,具体取决于您想要做什么。

最灵活的方法是避免使用@ResponseBody并坚持使用Spring MVC的视图系统。

这将允许您对XML,JSON,JasperReports和HTML视图使用相同的控制器。

对于JSON,您应该使用MappingJackson2JsonView,并确保Jackson在您的类路径中。

如果您只想返回JSON,那么MappingJackson2JsonView视图应该是您唯一的视图。如果要根据请求返回多种内容类型,则应使用ContentNegotiatingViewResolver以及其他视图,例如MarshallingView for XML或FreeMarkerViewResolver。

答案 2 :(得分:0)

  1. 创建MappingJackson2JsonView的实例
  2. 将视图设置为返回的ModelAndView
  3. 的上述实例