【JavaEE】深入浅出Spring MVC:从JSON到文件上传


JSON介绍

JSON概念

JSON:JavaScript Object Notation 【JavaScript 对象表⽰法】

JSON是⼀种轻量级的数据交互格式. 它基于 ECMAScript (欧洲计算机协会制定的js规范)的⼀个⼦集,采⽤完全独⽴于编程语⾔的⽂本格式来存储和表⽰数据。-- 百度百科

JSON本质上是一个字符串

简单来说:JSON就是⼀种数据格式, 有⾃⼰的格式和语法, 使⽤⽂本表⽰⼀个对象或数组的信息, 因此JSON本质是字符串. 主要负责在不同的语⾔中数据传递和交换.

类似于:

  • 国际通⽤语⾔-英语
  • 中国56个⺠族不同地区的通⽤语⾔-普通话

有⾃⼰的语法, 其他语⾔也认识.

JSON与Javascript的关系

没有关系, 只是语法相似, js开发者能更快的上⼿⽽已, 但是他的语法本⾝⽐较简单, 所以也很好学

JSON语法

JSON 是⼀个字符串,其格式⾮常类似于 JavaScript 对象字⾯量的格式

{
	"squadName": "Super hero squad",
	"homeTown": "Metro City",
	"formed": 2016,
	"secretBase": "Super tower",
	"active": true,
	"members": [{
			"name": "Molecule Man",
			"age": 29,
			 "secretIdentity": "Dan Jukes",
 			"powers": ["Radiation resistance", "Turning tiny", "Radiation blast"]
	}, {
			"name": "Madame Uppercut",
			"age": 39,
			"secretIdentity": "Jane Wilson",
			"powers": ["Million tonne punch", "Damage resistance", "Superhuman"]
	}, {
			"name": "Eternal Flame",
			"age": 1000000,
			"secretIdentity": "Unknown",
			"powers": ["Immortality", "Heat Immunity", "Inferno", "Teleportation"]
 	}]
}

也可以压缩表⽰:

{"squadName":"Super hero squad","homeTown":"Metro 
City","formed":2016,"secretBase":"Super tower","active":true,"members":
[{"name":"Molecule Man","age":29,"secretIdentity":"Dan Jukes","powers":
["Radiation resistance","Turning tiny","Radiation blast"]},{"name":"Madame 
Uppercut","age":39,"secretIdentity":"Jane Wilson","powers":["Million tonne 
punch","Damage resistance","Superhuman reflexes"]},{"name":"Eternal 
Flame","age":1000000,"secretIdentity":"Unknown","powers":["Immortality","Heat 
Immunity","Inferno","Teleportation","Interdimensional travel"]}]}

和上⾯描述的数据⼀样, 只不过上⾯的进⾏了格式化, 更易读.

JSON的语法:

  1. 数据在 键值对(Key/Value) 中
  2. 数据由逗号 , 分隔
  3. 对象⽤ {} 表⽰
  4. 数组⽤ [] 表⽰
  5. 值可以为对象, 也可以为数组, 数组中可以包含多个对象

JSON的两种结构

  1. 对象: ⼤括号 {} 保存的对象是⼀个⽆序的 键值对 集合. ⼀个对象以左括号 { 开始, 右括号 } 结束。每个"键"后跟⼀个冒号 : ,键值对使⽤逗号 , 分隔

  2. 数组: 中括号 [] 保存的数组是值(value)的有序集合. ⼀个数组以左中括号 [ 开始, 右中括号 ] 结束,值之间使⽤逗号 , 分隔。

在这里插入图片描述

所以, 以下都是合法的JSON数据

{"name":"admin","age":18}
["hello", 3.1415, "json"]
[{"name":"admin","age":18},{"name":"root","age":16},{"name":"张三","age":20}]

可以使⽤在线JSON格式化⼯具来进⾏校验和书写: 在线JSON校验格式化⼯具(Be JSON)

JSON字符串和Java对象互转

JSON本质上是⼀个字符串, 通过⽂本来存储和描述数据

Spring MVC 框架也集成了JSON的转换⼯具, 我们可以直接使⽤, 来完成JSON字符串和Java对象的互转

本质上是jackson-databind提供的功能, Spring MVC框架中已经把该⼯具包引⼊了进来, 咱们直接使⽤即可, 如果脱离Spring MVC 使⽤, 需要引⼊相关依赖

<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
 <groupId>com.fasterxml.jackson.core</groupId>
 <artifactId>jackson-databind</artifactId>
 <version>2.14.2</version>
</dependency>

JSON的转换⼯具包有很多, jackson-databind只是其中的⼀种.

public class JSONUtils {
	private static ObjectMapper objectMapper = new ObjectMapper();

	public static void main(String[] args) throws JsonProcessingException {
		Person person = new Person();
		person.setId(5);
		person.setName("zhangsan");
		person.setPassword("123456");
		//对象转为JSON字符串
		String jsonStr = objectMapper.writeValueAsString(person);
		System.out.println("JSON字符串为:"+jsonStr);
		//JSON字符串转为对象
		Person p = objectMapper.readValue(jsonStr,Person.class);
		System.out.println("转换的对象id:"+p.getId()+",name:"+p.getName()+",passwo
	}
}

使⽤ ObjectMapper 对象提供的两个⽅法, 可以完成对象和JSON字符串的互转

writeValueAsString: 把对象转为JSON字符串

readValue: 把字符串转为对象

JSON优点

  1. 简单易⽤: 语法简单,易于理解和编写,可以快速地进⾏数据交换

  2. 跨平台⽀持: JSON可以被多种编程语⾔解析和⽣成, 可以在不同的平台和语⾔之间进⾏数据交换和传输

  3. 轻量级: 相较于XML格式, JSON数据格式更加轻量级, 传输数据时占⽤带宽较⼩, 可以提⾼数据传输速度

  4. 易于扩展: JSON的数据结构灵活,⽀持嵌套对象和数组等复杂的数据结构,便于扩展和使⽤

  5. 安全性: JSON数据格式是⼀种纯⽂本格式,不包含可执⾏代码, 不会执⾏恶意代码,因此具有较⾼的安全

基于以上特点, JSON在Web应⽤程序中被⼴泛使⽤, 如前后端数据交互、API接⼝数据传输等

传递JSON数据

这个数据一定是在请求正文中

接口值API,就是指应用程序提供了哪些服务,接口如果对应到代码上,通常是指方法

接收JSON对象, 需要使⽤ @RequestBody 注解

RequestBody: 请求正⽂,意思是这个注解作⽤在请求正⽂的数据绑定,请求参数必须在写在请求正⽂中

@RequestMapping("/m8")
public String m8(@RequestBody Person person){
    return "接收到的参数person:"+ person.toString();
}

在这里插入图片描述

获取URL中参数

@PathVariable

path variable: 路径变量

和字⾯表达的意思⼀样, 这个注解主要作⽤在请求URL路径上的数据绑定

默认传递参数写在URL上,SpringMVC就可以获取到

@RequestMapping("/m9/{userId}")
public String m9(@PathVariable Integer userId){
    return "接收到的参数userId:"+ userId;
}

在这里插入图片描述

@RequestMapping("/m9/{userId}/{name}")
public String m9(@PathVariable Integer userId,@PathVariable String name){
    return "接收到的参数userId:"+ userId+",name:"+name;
}

可以写一个也可以写多个,但要注意顺序

在这里插入图片描述

如果⽅法参数名称和需要绑定的URL中的变量名称⼀致时, 可以简写, 不⽤给@PathVariable的属性赋值, 如上述例⼦中的id变量

如果⽅法参数名称和需要绑定的URL中的变量名称不⼀致时, 需要@PathVariable的属性value赋值, 如上述例⼦中的userName变量,

("name")这部分

上传文件

@RequestPart

@RequestMapping("/m10")
public String m10(@RequestPart MultipartFile file){
    System.out.println(file.getOriginalFilename());
    return "success";
}

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

这里要选择file

@RequestMapping("/m10")
public String m10(@RequestPart MultipartFile file) throws IOException {
    System.out.println(file.getOriginalFilename());
    file.transferTo(new File("D:/tempidea/"+file.getOriginalFilename()));
    return "success";
}

在这里插入图片描述

D:\tempidea路径下文件上传成功

  • 26
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值