JSON回顾,如果是新手,可以简单看看;如果老手勿喷,直接拉到下文从前言开始...
JSON简介
在企业当中,我们都知道为了前后端分离统一,使用开发原则中的“约定大于配置”的原则,甚至团队开发规范、开发编译环境等等也是要大家约定来执行的,提高各自的开发效率。而其中一个特别重要的约定就是前端后端中间彼此传输的数据一般情况都推荐使用JSON格式数据,原因有以下几点:
JAVAScript Object Notation是一种轻量级的数据交换格式。
具有良好的可读和便于快速编写的特性。
业内主流技术为其提供了完整的解决方案(有点类似于正则表达式 ,获得了当今大部分语言的支持)。
JSON采用兼容性很高的文本格式,同时也具备类似于C语言体系的行为。 – Json.org
JSON作为数据是目前网络中主流的数据传输格式之一,应用十分广泛,说是使用率达到99%一点也不勉强。
数据格式比较简单, 易于读写, 格式都是压缩的, 占用带宽小。
易于解析这种语言, 客户端JavaScript可以简单的通过eval()进行JSON数据的读取。
因为JSON格式能够直接为服务器端代码使用, 大大简化了服务器端和客户端的代码开发量, 但是完成的任务不变, 且易于维护。
JSON支持的数据类型
JSON里面的数据是以一种键值对的方式存在,("key": "value")中值的类型可以是下面数据类型中的任意一种:
数字(整数或浮点数)
逻辑值(true 或 false)
字符串(在双引号中)
数组(在方括号中)
函数
对象(在大括号中)
null
JSON语法规则
1、基本语法(英文状态):
大括号:{}
中括号:[]
逗号:,
冒号::
双引号:""
2、数据类型:
嵌套对象
数组
字符串
数字
布尔值
空值
3、组合解析:
{} 解析大括号类型
[] 解析中括号类型
{"key": [...]} 解析大括号嵌套中括号类型
[{"key": "value"}] 解析中括号嵌套大括号类型
JSON数据解析
如果看到是{ } => 使用 JSONObject 解析
如果看到的[ ] => 使用 JSONArray 解析
前言
该项目是一个SpringMVC中自定义解析JSON参数的Project,我们都知道Spring传统的解决方案是@RequestBody来解析JSON格式参数,但这样一来,会出现一个很不方便的问题,失去了@RequestParam的特性——自定义分参解析,因为@RequestBody只能一次性全部解析完,这样又会带来一个可读性的问题,如果是多个简单的JSON数据混合在一起的话,只能用Map来接收,这样导致可读性严重下降。所以,@RequestJson的出现就是为了解决这两大问题,也可以这么理解@RequestJson的特性:@RequestJson == @RequestBody + @RequestParam。
在项目中,如果后端要接收前端传来的 json 参数,原 spring 虽然提供了 @RequestBody 注解来封装 json 数据,但局限性也挺大的(因为@RequestBody + @RequestParm无法相辅相成),对参数要么适用 jsonObject 或者 javaBean 类,或者 string。
若使用 jsonObject 接收,对于 json 里面的参数,还要进一步获取解析,很麻烦。
若使用 javaBean 来接收,若接口参数不一样,那么每一个接口都得对应一个javaBean。
若使用 string 来接收,那么也得需要自己解析json参数。
@RequestBody有单体限制的问题
Map解析器优先于自定义解析器的问题
所以就琢磨了一个和GET/POST - JSON提交方式一样,直接在Controller层接口写参数名即可接收对应JSON数据参数值。
运行环境
JDK 1.8
IDEA 2018.3
技术理解
@RequestMapping
@RequestParam
@RequestBody
@PathVariable
HandlerMethodArgumentResolver
一、理解 @RequestMapping
国际惯例先介绍什么是@RequestMapping,@RequestMapping 是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径;用于方法上,表示在类的父路径下追加方法上注解中的地址将会访问到该方法,此处需注意@RequestMapping用在类上可以没有,但是用在方法上必须有。
@Controller @RequestMapping(value = "/controllers") // 设置想要跳转的父路径 public class StatisticUserCtrl { //如需注入,则写入需要注入的类 //@Autowired // 设置方法下的子路经 @RequestMapping(value = "/method") public String helloworld() { return "helloWorld"; } }