Spring MVC返回json視圖時,如何將對象直接序列化成不帶變量名作爲根節點

Spring MVC返回json視圖時,如何將對象直接序列化成不帶變量名作爲根節點的 json 報文


###問題 問題描述起來比較拗口,其實就是用Spring MVC時,如何將對象映射成 json 報文時不把對象做爲json的根節點。即便用@ResponseBody的效果。 好比,默認狀況下,使用ModelAndView的addObject(key,object)或者ModelMap的addAttribute(key,object)保存完Java對象,而後交給Srping的視圖解析器解析成json時,會以key作爲json的根節點的名字,若是沒有傳入key,則使用類名生成一個camel的根節點名字,像這樣:前端

{
    "objectName": {
        "id": 123,
        "name": "zhangsan"
    }
}

而Controller中若是用@ResponseBody註解的話,不會生成根節點,最終返回的json報文是這樣子的:java

{
    "id": 123,
    "name": "zhangsan"
}

當項目中的Controller中存在@ResponseBody與ModelAndView混用的狀況時,返回的報文格式不一致,對前端解來講解析很是不方便(有些地方從根節點裏面讀取,有些又直接從返回的json對象裏讀)。web

###解決方案 以前baidu中沒有發現相似問題的描述,後來仍是google從stackoverflow中找到的解決方案,看來google對我來講查找問題命中率更高呢。:) 解決方案很簡單,就是將Spring中json視圖的 extractValueFromSingleKeyModel 設置爲true。 Spriing3.1以前json視圖爲org.springframework.web.servlet.view.json.MappingJacksonJsonView 3.1以後的版本推薦用做爲json視圖org.springframework.web.servlet.view.json.MappingJackson2JsonView。 如下是Spring MVC容器中的配置,這裏使用Xml配置:spring

<!--spring3.1如下配置-->
<bean	class="org.springframework.web.servlet.view.json.MappingJacksonJsonView">
		<property name="extractValueFromSingleKeyModel" value="true" />
</bean>
<!--spring3.1以上配置-->
<bean	class="org.springframework.web.servlet.view.json.MappingJackson2JsonView">
		<property name="extractValueFromSingleKeyModel" value="true" />
</bean>

這樣無論用@ResponseBody仍是ModelAndVuiew返回json,都不會有根節點了。 下面是Spring API對這個屬性的說明:json

public void setExtractValueFromSingleKeyModel(boolean extractValueFromSingleKeyModel) Set whether to serialize models containing a single attribute as a map or whether to extract the single value from the model and serialize it directly. The effect of setting this flag is similar to using MappingJackson2HttpMessageConverter with an @ResponseBody request-handling method.api

意思就是控制直接序列化對象仍是使用一個屬性包裹它,這個設置相似使用@ResponseBodyspring-mvc

###參考 1.stackoverflow上的帖子: http://stackoverflow.com/questions/9517189/spring-mvc-and-jackson-mapping-do-not-return-the-root-element-in-json 2.Spring的API文檔: http://docs.spring.io/spring/docs/current/javadoc-api/mvc

相關文章
相關標籤/搜索