springMVC4中json与对象互转实例解析请求响应数据转换器
来源:互联网 发布:网络磕是什么意思 编辑:程序博客网 时间:2024/06/05 00:45
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>>
1
2
3
4
5
6
7
8
9
10
11
12
13
另一种是启用注解<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>
1
2
3
4
5
6
7
8
9
10
2. 装配MappingJacksonHttpMessageConverter
这里我们使用上面提到的方式二更为便利,在spring容器中加入:
<mvc:annotation-driven />
关于springMVC所需的其他配置,可参考我的另一篇文章,或通过文尾的源码下载获取
3. 编写测试文件
下面是我们的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方法
}
1
2
3
4
5
6
7
8
9
10
11
12
下面是我们的控制层测试文件:
@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;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
上面分别展示了注解和HttpEntity的用法。关于HttpResponse只是在HtppEntity的基础上进一步对相应信息进行封装,如修改一些相应头信息等
关于以上的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]
对于以上的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会为我们选择最恰当的数据转换器,它是按以下流程进行寻找的:
首先获取注册的所有HttpMessageConverter集合
然后客户端的请求header中寻找客户端可接收的类型,比如 Accept application/json,application/xml等,组成一个集合
所有的HttpMessageConverter 都有canRead和canWrite方法 返回值都是boolean,看这个HttpMessageConverter是否支持当前请求的读与写,读对应@RequestBody注解, 写对应@ResponseBody注解
遍历HttpMessageConverter集合与前面获取可接受类型进行匹配,如果匹配直接使用当前第一个匹配的HttpMessageConverter,然后return(一般是通过Accept和返回值对象的类型进行匹配
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>>
1
2
3
4
5
6
7
8
9
10
11
12
13
另一种是启用注解<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>
1
2
3
4
5
6
7
8
9
10
2. 装配MappingJacksonHttpMessageConverter
这里我们使用上面提到的方式二更为便利,在spring容器中加入:
<mvc:annotation-driven />
关于springMVC所需的其他配置,可参考我的另一篇文章,或通过文尾的源码下载获取
3. 编写测试文件
下面是我们的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方法
}
1
2
3
4
5
6
7
8
9
10
11
12
下面是我们的控制层测试文件:
@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;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
上面分别展示了注解和HttpEntity的用法。关于HttpResponse只是在HtppEntity的基础上进一步对相应信息进行封装,如修改一些相应头信息等
关于以上的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]
对于以上的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会为我们选择最恰当的数据转换器,它是按以下流程进行寻找的:
首先获取注册的所有HttpMessageConverter集合
然后客户端的请求header中寻找客户端可接收的类型,比如 Accept application/json,application/xml等,组成一个集合
所有的HttpMessageConverter 都有canRead和canWrite方法 返回值都是boolean,看这个HttpMessageConverter是否支持当前请求的读与写,读对应@RequestBody注解, 写对应@ResponseBody注解
遍历HttpMessageConverter集合与前面获取可接受类型进行匹配,如果匹配直接使用当前第一个匹配的HttpMessageConverter,然后return(一般是通过Accept和返回值对象的类型进行匹配
0 0
- springMVC4中json与对象互转实例解析请求响应数据转换器
- springMVC4(4)json与对象互转实例解析请求响应数据转换器
- springMVC4(10)强大类型转换器实例解析
- Android网络请求与JSON解析和数据抓取小实例
- SpringMVC实现JSON数据的请求与响应
- JSON解析类库之JSON-lib --- JSON-lib类库学习, 生成与解析json数据, json字符串与Java对象互转
- Json解析数据实例
- springMVC4(1)角色解析与入门配置实例
- http请求与响应解析
- json字符串与json对象互转的方法解析
- JSON解析类库之Fastjson(1) --- Fastjson类库学习, 生成与解析json数据,json字符串与Java对象互转
- JSON解析类库之Jackson(1) --- Jackson类库学习, 生成与解析json数据,json字符串与Java对象互转
- Delphi中JSon SuperObject 使用:数据集与JSON对象互转
- Delphi中JSon SuperObject 使用:数据集与JSON对象互转
- Echarts请求json数据实例
- HTTP数据请求与响应
- javaweb使用get与post请求json数据并解析
- ajax同步异步请求与JSON数据解析
- android快速开发框架
- C#综合揭秘——利用泛型与反射更新实体(ADO.NET Entity Framework)
- VC++ 截取字符串的常用方法(AfxExtractSubString)
- Lift Hopping, UVa 10801【Floyd】
- canvas 的使用1
- springMVC4中json与对象互转实例解析请求响应数据转换器
- 为何要用多线程编程
- BZOJ1090记忆化搜索
- 检查变量是否存在
- 上传头像功能,需要对上传的图片进行截取,springMVC+spring+mybatis。
- 数据库中的键和约束
- 虚函数和纯虚函数
- POJ 1729 Jack and Jill BFS *
- 不行诡诈