###問題 問題描述起來比較拗口,其實就是用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