springMVC4(4)json与对象互转实例解析请求响应数据转换器

简介: <div class="markdown_views"><h1 id="格式化数据输入输出">格式化数据输入输出</h1><p>Spring3.0的重要接口:HttpMessageConveter为我们提供了强大的数据转换功能,将我们的请求数据转换为一个java对象,或将java对象转化为特定格式输出等。比如我们常见的从前端注册表单获取json数据并转化为User对象,或

格式化数据输入输出

Spring3.0的重要接口:HttpMessageConveter为我们提供了强大的数据转换功能,将我们的请求数据转换为一个java对象,或将java对象转化为特定格式输出等。比如我们常见的从前端注册表单获取json数据并转化为User对象,或前端获取用户信息,后端输出User对象转换为json格式传输给前端等。

spring 为我们提供了众多的HttpMessageConveter实现类,其中我们可能用得最多的三个实现类是:

实现类 功能
FormHttpMessageConverter 从请求和响应读取/编写表单数据。默认情况下,它读取媒体类型 application/x-www-form-urlencoded 并将数据写入MultiValueMap<String,String>
MarshallingHttpMessageConverter 使用 Spring 的 marshaller/un-marshaller 读取/编写 XML 数据。它转换媒体类型为 application/xml
MappingJacksonHttpMessageConverter 使用 Jackson 的 ObjectMapper 读取/编写 JSON 数据。它转换媒体类型为application/json

转换器的装配方式有两种,一种是通过注册org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter来装配messageConverters,如下所示:

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="messageConverters"><!-- 装配数据转换器 -->
        <list>
            <ref bean="jsonConverter" /><!-- 指定装配json格式的数据转换器 -->
        </list>
    </property>
</bean>

<bean id="jsonConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
    <!-- 使用MappingJacksonHttpMessageConverter完成json数据转换 -->
    <property name="supportedMediaTypes" value="application/json" />
    <!-- 设置转换的media类型为application/json -->
</bean>>

另一种是启用注解<mvc:annotation-driven />
该注解会会初始化7个转换器:
- ByteArrayHttpMessageConverter
- StringHttpMessageConverter
- ResourceHttpMessageConverter
- SourceHttpMessageConverter
- XmlAwareFormHttpMessageConverter
- Jaxb2RootElementHttpMessageConverter
- MappingJacksonHttpMessageConverter

通过以上两种方法,我们即可完成我们的转换器注册。
但我们想要在控制层完成数据的输入输出转换,需要通过下列途径:
1. 使用@RequestBody和@ResponseBody对处理方法进行标注。其中@RequestBody通过合适的HttpMessageConverter将HTTP请求正文转换为我们需要的对象内容。而@ResponseBody则将我们的对象内容通过合适的HttpMessageConverter转换后作为HTTP响应的正文输出。
2. 使用HttpEntity、ResponseEntity作为处理方法的入参或返回值

实例分析

通过以上讲解,我们已经有足够的知识准备,来完成我们的实例:将json数据转换为合适的java对象输入,并将java对象转换为符合格式的json字符输出:

1. 导入需要的jar包

装配MappingJacksonHttpMessageConverter需要我们的jackson相关jar包,我们使用maven来管理项目,在pom.xml中配置如下信息:

<dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-core-asl</artifactId>
    <version>1.9.2</version>
</dependency>
<dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-mapper-asl</artifactId>
    <version>1.9.2</version>
</dependency>

2. 装配MappingJacksonHttpMessageConverter

这里我们使用上面提到的方式二更为便利,在spring容器中加入:
<mvc:annotation-driven />

关于springMVC所需的其他配置,可参考我的另一篇文章,或通过文尾的源码下载获取

3. 编写测试文件

  1. 下面是我们的User POJO测试类

    public class User {
        private Integer id;
        private String userName;
        private String password;
    
        @Override
        public String toString() {
            return "User [id=" + id + ", userName=" + userName + ", password="
                    + password + "]";
        }
        //忽略每个参数的get和set方法
    }
  2. 下面是我们的控制层测试文件:

    @Controller
    @RequestMapping("/user")
    public class UserController {
        @RequestMapping("getUser")
        public void getUser( @RequestBody User user){//将输入数据转化为User对象
            System.out.println(user);
        }
    
        @RequestMapping("getUser1")
        public void getUser1( HttpEntity<User> userEntity){//将输入数据转化为User对象
            System.out.println(userEntity.getBody());
        }
        @ResponseBody//将输出的java对象转换为合适的相应正文输出
        @RequestMapping("getUser2")
        public User getUser2(User user){
            System.out.println(user);
            return user;
        }
        @RequestMapping("getUser3")
        public HttpEntity<User> getUser3(User user){
            System.out.println(user);
            HttpEntity<User> uEntity = new HttpEntity<User>(user);
            return uEntity;
        }
    }

    上面分别展示了注解和HttpEntity的用法。关于HttpResponse只是在HtppEntity的基础上进一步对相应信息进行封装,如修改一些相应头信息等

    1. 关于以上的getUser()getUser1()能将我们的json字符串转换为相应的对象,我们可以任何参数名输入:
      {“id”:10,”password”:”myPassword”,”userName”:”myUserName”}
      在这里我们需要的是需将请求头的contentType设置为”application/json;UTF-8“。这样spring才能找到对应的json解析器对我们的json字符串进行解析。否则会报错误:415 Unsupported Media Type
      程序中方法调用User的toString()在控制台打印字段:
      User [id=10, userName=asd, password=qwe]
    2. 对于以上的getUser2()和getUser3()方法,我们访问如:
      http://localhost:8080/springMVC/user/getUser3?id=10&password=qwe&userName=asd。然后spring会帮我们自动将参数对应User对象的属性名绑定到方法入参的user对象中(关于复杂对象、集合绑定可参考我后面系列的文章)。根据上面url传入的参数,spring自动将我们的User对象转换为json格式字符串输出,内容如下:
      {"id":10,"userName":"asd","password":"qwe"}

选择合适的数据转换器

在前面讲解中,我们通过AnnotationMethodHandlerAdapter注册了众多的数据转换器,而spring会针对不同的请求响应媒体类型,spring会为我们选择最恰当的数据转换器,它是按以下流程进行寻找的:

  1. 首先获取注册的所有HttpMessageConverter集合
  2. 然后客户端的请求header中寻找客户端可接收的类型,比如 Accept application/json,application/xml等,组成一个集合
  3. 所有的HttpMessageConverter 都有canRead和canWrite方法 返回值都是boolean,看这个HttpMessageConverter是否支持当前请求的读与写,读对应@RequestBody注解, 写对应@ResponseBody注解
  4. 遍历HttpMessageConverter集合与前面获取可接受类型进行匹配,如果匹配直接使用当前第一个匹配的HttpMessageConverter,然后return(一般是通过Accept和返回值对象的类型进行匹配)

源码下载

本例的示例代码可到https://github.com/jeanhao/spring的mvc_messageConvertor1文件夹中下载

目录
相关文章
|
8月前
|
存储 Java 文件存储
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录—— logback.xml 配置文件解析
本文解析了 `logback.xml` 配置文件的详细内容,包括日志输出格式、存储路径、控制台输出及日志级别等关键配置。通过定义 `LOG_PATTERN` 和 `FILE_PATH`,设置日志格式与存储路径;利用 `&lt;appender&gt;` 节点配置控制台和文件输出,支持日志滚动策略(如文件大小限制和保存时长);最后通过 `&lt;logger&gt;` 和 `&lt;root&gt;` 定义日志级别与输出方式。此配置适用于精细化管理日志输出,满足不同场景需求。
2057 1
|
8月前
|
XML JSON API
淘宝商品详情API的调用流程(python请求示例以及json数据示例返回参考)
JSON数据示例:需要提供一个结构化的示例,展示商品详情可能包含的字段,如商品标题、价格、库存、描述、图片链接、卖家信息等。考虑到稳定性,示例应基于淘宝开放平台的标准响应格式。
|
8月前
|
数据采集 JSON 数据可视化
JSON数据解析实战:从嵌套结构到结构化表格
在信息爆炸的时代,从杂乱数据中提取精准知识图谱是数据侦探的挑战。本文以Google Scholar为例,解析嵌套JSON数据,提取文献信息并转换为结构化表格,通过Graphviz制作技术关系图谱,揭示文献间的隐秘联系。代码涵盖代理IP、请求头设置、JSON解析及可视化,提供完整实战案例。
526 4
JSON数据解析实战:从嵌套结构到结构化表格
|
10月前
|
JSON 前端开发 搜索推荐
关于商品详情 API 接口 JSON 格式返回数据解析的示例
本文介绍商品详情API接口返回的JSON数据解析。最外层为`product`对象,包含商品基本信息(如id、name、price)、分类信息(category)、图片(images)、属性(attributes)、用户评价(reviews)、库存(stock)和卖家信息(seller)。每个字段详细描述了商品的不同方面,帮助开发者准确提取和展示数据。具体结构和字段含义需结合实际业务需求和API文档理解。
|
10月前
|
XML Java 开发者
Spring底层架构核心概念解析
理解 Spring 框架的核心概念对于开发和维护 Spring 应用程序至关重要。IOC 和 AOP 是其两个关键特性,通过依赖注入和面向切面编程实现了高效的模块化和松耦合设计。Spring 容器管理着 Beans 的生命周期和配置,而核心模块为各种应用场景提供了丰富的功能支持。通过全面掌握这些核心概念,开发者可以更加高效地利用 Spring 框架开发企业级应用。
315 18
|
9月前
|
传感器 监控 安全
智慧工地云平台的技术架构解析:微服务+Spring Cloud如何支撑海量数据?
慧工地解决方案依托AI、物联网和BIM技术,实现对施工现场的全方位、立体化管理。通过规范施工、减少安全隐患、节省人力、降低运营成本,提升工地管理的安全性、效率和精益度。该方案适用于大型建筑、基础设施、房地产开发等场景,具备微服务架构、大数据与AI分析、物联网设备联网、多端协同等创新点,推动建筑行业向数字化、智能化转型。未来将融合5G、区块链等技术,助力智慧城市建设。
444 1
|
10月前
|
JSON 小程序 UED
微信小程序 app.json 配置文件解析与应用
本文介绍了微信小程序中 `app.json` 配置文件的详细
1514 12
|
10月前
|
JSON 缓存 API
解析电商商品详情API接口系列,json数据示例参考
电商商品详情API接口是电商平台的重要组成部分,提供了商品的详细信息,支持用户进行商品浏览和购买决策。通过合理的API设计和优化,可以提升系统性能和用户体验。希望本文的解析和示例能够为开发者提供参考,帮助构建高效、可靠的电商系统。
374 12
|
设计模式 前端开发 JavaScript
Spring MVC(一)【什么是Spring MVC】
Spring MVC(一)【什么是Spring MVC】
|
前端开发 Java 关系型数据库
基于ssm框架旅游网旅游社交平台前后台管理系统(spring+springmvc+mybatis+maven+tomcat+html)
基于ssm框架旅游网旅游社交平台前后台管理系统(spring+springmvc+mybatis+maven+tomcat+html)
222 0

热门文章

最新文章

推荐镜像

更多
  • DNS