logo头像

不破不立

SpringMVC数据绑定(JSON格式和XML格式)

接着上篇对于form表单形式和url直接传参形式讲解,继续进行对JSON格式和XML格式数据解析绑定的讲解。

内容大纲

  1. JSON格式
    1.1 简单对象
    1.2 简单对象包含对象,即多层级对象
    1.3 对象数组
    1.4 集合List类型
  2. XML格式

开发工具

  Spring版本: 4.1.6.RELEASE
  IDE工具版本: IntelliJ IDEA 2017
  请求模拟工具: Postman


1. JSON格式

  实现SpringMVC对于JSON数据解析绑定需要进行以下4步:
  1). 导入json的jar包:jackson,如对应的maven的pom为

1
2
3
4
5
6
7
8
9
10
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.5.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.5.2</version>
</dependency>

  2). 在spring-mvc的配置文件中添加对于json数据解析绑定的配置,这里可以通过<mvc:annotation-driven/>直接快速使用;
  3). 前台发送请求必须注明[“Content-Type”:”application/json”],同时需要将传递的JSON数据字符串化,如User对象的JSON字符串形式为:

1
2
3
4
{
"name":"Tom",
"age":20
}

  4). 在controller中进行接收时,需要在参数位置前指定 @RequestBody 注解。

1.1 简单对象(简单对象包含对象,即多层级对象)

  继续在上一篇中提到的DataBindController类中增加以下方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
* JSON格式简单对象
* post方式:http://localhost:8080/springmvc/jsonObjectType
* 注明["Content-Type":"application/json"]以及参数为{ "name":"Tom","age":20 }
* @param user
* @return json串
*/
@RequestMapping("/jsonObjectType")
@ResponseBody
public String jsonObjectType(@RequestBody User user){
String msg = user.toString();
logger.info(msg);
return msg;
}

  打开Postman,填写好相关参数,提交post请求,可以看到如下结果:

  返回值 User{name='Tom', age=20} 表示请求成功。

1.2 简单对象包含对象,即多层级对象

  继续测试简单对象包含对象(即多层级对象),增加两个类ContactInfo{phone,email}和Person{name,age,contactInfo},实现get,set和toString方法。
  加入以下代码到DataBindController类中,提交post请求并填写好请求参数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
* JSON格式多层级简单对象
* post方式:http://localhost:8080/springmvc/jsonObjectsType
* 注明["Content-Type":"application/json"]以及参数为{ "name":"Tom","age":20,"contactInfo":{ "phone":"18074609999","email":"test@yeah.net"} }
*
* @param person
* @return json串
*/
@RequestMapping("/jsonObjectsType")
@ResponseBody
public String jsonObjectsType(@RequestBody Person person) {
String msg = person.toString();
logger.info(msg);
return msg;
}

  返回结果为 { "name":"Tom","age":20,"contactInfo":{ "phone":"18074609999","email":"test@yeah.net"} },表示请求成功。

1.3 对象数组

  同上述简单对象类似,只需要在参数位置将其改为数组形式即可,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
* JSON格式简单对象数组
* post方式:http://localhost:8080/springmvc/jsonObjectArrayType
* 注明["Content-Type":"application/json"]以及参数为[{"age":18,"name":"Tom"},{"age":10,"name":"Jack"}]
* @param users
* @return json串
*/
@RequestMapping("/jsonObjectArrayType")
@ResponseBody
public String jsonObjectArrayType(@RequestBody User[] users){
StringBuilder msg = new StringBuilder();
for (User user :users){
msg.append(user.toString()+" ");
}
logger.info(msg.toString());
return msg.toString();
}

  测试结果会得到 User{name='Tom', age=18} User{name='Jack', age=10},请求成功。

1.4 集合List类型

  将参数形式改为List即可,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
* JSON格式简单对象List集合形式
* post方式:http://localhost:8080/springmvc/jsonObjectListType
* 注明["Content-Type":"application/json"]以及参数为[{"age":18,"name":"Tom"},{"age":10,"name":"Jack"}]
*
* @param userList
* @return
*/
@RequestMapping("/jsonObjectListType")
@ResponseBody
public String jsonObjectListType(@RequestBody List<User> userList) {
StringBuilder msg = new StringBuilder();
for (User user : userList) {
msg.append(user.toString() + " ");
}
logger.info(msg.toString());
return msg.toString();
}

  可以看到测试结果与数组形式的结果相同,也是User{name='Tom', age=18} User{name='Jack', age=10},请求成功。
  这里需要注意参数形式为List<User>,如果像form表单那样传UserListVO时则会提示400错误。

2. XML格式

  实现SpringMVC对于JSON数据解析绑定需要进行以下4步:
  1). 导入xml的jar包:因为spring-oxm提供对xml的支持,故引入spring-oxm即可;
  2). 在spring-mvc的配置文件中添加对于xml数据解析绑定的配置,这里可以通过<mvc:annotation-driven/>直接快速使用
  3). 前台发送请求必须注明[“Content-Type”:”application/xml”],
    同时需要注意,对于传输的指定对象,需要在对象的类里面进行相关操作,
    在类上面添加@XmlRootElement(name=”如article”),在其属性的所有get方法上根据需要分别添加对应的@XmlElement(name = “如title,content”),分别表示xml文件中的根节点和节点
    同时注意参数的形式,如Article对象,

1
2
3
4
5
<?xml version="1.0" encoding="UTF-8"?>
<article>
<title>here is title</title>
<content>here is content</content>
</article>

  4). 在controller中进行接收时,需要在参数位置前指定 @RequestBody 注解。

  继续添加以下方法到DataBindController类中,在Postman中填写好参数,提交post请求,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
* XML格式
* post方式:http://localhost:8080/springmvc/xmlType
* 注明["Content-Type":"application/xml"]以及参数为
* <?xml version="1.0" encoding="UTF-8"?><article><title>here is title</title><content>here is content</content></article>
* @param article
* @return json串
*/
@RequestMapping("/xmlType")
@ResponseBody
public String xmlType(@RequestBody Article article){
String msg = article.toString();
logger.info(msg);
return msg;
}

  结果显示 Article{title='here is title', content='here is content'},表示请求成功。

  本文的代码可以在github上找到,地址为:github.com/panhainan/spring-family

上一篇

评论系统未开启,无法评论!

如果有好的建议或疑问等可以发送邮件至:panhainan@yeah.net,或者添加QQ:1016593477,将你的建议或者疑问告诉作者,作者会对你的建议进行处理并补充到文章的尾部,谢谢大家的谅解!