Spring MVC返回json视图时,如何将对象直接序列化成不带变量名做为根节点
Spring MVC返回json视图时,如何将对象直接序列化成不带变量名做为根节点
Tek_Eternal 发表于3年前
Spring MVC返回json视图时,如何将对象直接序列化成不带变量名做为根节点
  • 发表于 3年前
  • 阅读 1370
  • 收藏 13
  • 点赞 0
  • 评论 1

腾讯云 十分钟定制你的第一个小程序>>>   

摘要: 问题描述起来比较拗口,其实就是用Spring MVC时,如何将对象映射成 json 报文时不把对象作为json的根节点。即使用@ResponseBody的效果。

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报文是这样子的:

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

当项目中的Controller中存在@ResponseBody与ModelAndView混用的情况时,返回的报文格式不一致,对前端解来说解析非常不方便(有些地方从根节点里面读取,有些又直接从返回的json对象里读)。

###解决方案 之前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配置:

<!--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对这个属性的说明:

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.

意思就是控制直接序列化对象还是使用一个属性包裹它,这个设置类似使用@ResponseBody

###参考 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/

标签: Sring json java
共有 人打赏支持
粉丝 10
博文 24
码字总数 16362
评论 (1)
番茄鸡蛋馍
79赞一个。
×
Tek_Eternal
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: