文档章节

Spring MVC返回json视图时,如何将对象直接序列化成不带变量名做为根节点

Tek_Eternal
 Tek_Eternal
发布于 2015/03/01 15:02
字数 628
阅读 1528
收藏 13

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/

© 著作权归作者所有

共有 人打赏支持
Tek_Eternal
粉丝 9
博文 24
码字总数 16362
作品 0
福州
程序员
加载中

评论(1)

Leonds
Leonds
79赞一个。
SpringMVC总结篇

SpringMVC是基于MVC设计理念的一款优秀的Web框架,是目前最流行的MVC框架之一,SpringMVC通过一套注解,让POPJ成为处理请求的控制器,而无需实现任何接口,然后使用实现接口的控制器也完全没...

qq58ef2349113e9
2017/04/13
0
0
浅谈Java中JSON的序列化问题

在Java Web开发的过程中,时常会遇到与自己预期不一样的情况。有的时候静下心来自己去研究一番内在的原因还是很有趣的。这两天在写java web的时候,碰到了一个对象序列化的问题,问题大概是这...

小欣妹妹
2017/10/24
0
0
Spring MVC

Spring MVC一、什么是 Spring MVC Spring MVC 属于 SpringFrameWork 的后续产品,已经融合在 Spring Web Flow 里面,是一个强大灵活的 Web 框架。Spring MVC 提供了一个 DispatcherServlet ...

任任任任师艳
2017/11/20
0
0
羊望/carson-web-mvc

Carson-Web-MVC Carson-Web-MVC是基于Spring MVC的轻量级扩展,借鉴了ASP.Net MVC及JFinal框架的思路,提供了一种更简洁的MVC路由模式。 该框架依赖于spring-webmvc和jackson。 URL路由无配置...

羊望
2017/02/05
0
0
Spring MVC入门

2.1、Spring Web MVC是什么Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动指的就是使...

bluecoffee
2016/09/09
35
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

7 个致命的 Linux 命令

导读 如果你是一个 Linux 新手,在好奇心的驱使下,可能会去尝试从各个渠道获得的命令。以下是 7 个致命的 Linux 命令,轻则使你的数据造成丢失,重则使你的系统造成瘫痪,所以,你应当竭力避...

问题终结者
今天
0
0
设计模式:工厂方法模式(工厂模式)

工厂方法模式才是真正的工厂模式,前面讲到的静态工厂模式实际上不能说是一种真正意义上的设计模式,只是一种变成习惯。 工厂方法的类图: 这里面涉及到四个种类: 1、抽象产品: Product 2、...

京一
今天
0
0
区块链和数据库,技术到底有何区别?

关于数据库和区块链,总会有很多的困惑。区块链其实是一种数据库,因为他是数字账本,并且在区块的数据结构上存储信息。数据库中存储信息的结构被称为表格。但是,区块链是数据库,数据库可不...

HiBlock
今天
0
0
react native 开发碰到的问题

react-navigation v2 问题 问题: static navigationOptions = ({navigation, navigationOptions}) => ({ headerTitle: ( <Text style={{color:"#fff"}}>我的</Text> ), headerRight: ( <View......

罗培海
今天
0
0
Mac Docker安装流程

久仰Docker大名已久,于是今天趁着有空,尝试了一下Docker 先是从docker的官网上下载下来mac版本的docker安装包,安装很简易,就直接拖图标就好了。 https://www.docker.com/products/docker...

writeademo
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部