时间:2021-05-20
JSON知识讲解
JSON的定义
JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
解释来自于百度百科,说简单点。JSON就是一串字符串 只不过元素会使用特定的符号标注。
JSON的几种常见格式
对象
数组
对象数组
数组对象
[{"username": "张三","age": 18},{"username": "李四","age": 20}]复杂的格式
使用JSON的好处
JSON的知识,就讲到这里。
最近在弄监控主机项目,对javaweb又再努力学习。实际的项目场景中,前后分离几乎是所以项目的标配,全栈的时代的逐渐远去,后端负责业务逻辑处理,前端负责数据展示成了一种固定的开发模式。像thymeleaf这种东西没法实现前后端分离模板难学也只有写java的才用吧,还是用js模板引擎接受json好。
1. Json报文
SpringBoot 默认会使用 Json 作为响应报文格式。首先,我们创建一个 UserController 用于处理前端的 Web 请求。
定义一个简单的控制器,与通常返回 Url 的 Controller 不一样的是,login() 使用了 @ResponseBody 注解,它表示此接口响应为纯数据,不带任何界面展示,可以获得标准Json。
@Controller@RequestMapping("/user")public class UserController { @RequestMapping("/login") @ResponseBody public RespEntity login(@RequestBody ReqUser reqUser) { //使用reqUser模型来接受,而不用User User user = new User(); if(reqUser != null) { user.setName(reqUser.getName()); user.setPassword(reqUser.getPassword()); } return new RespEntity(RespCode.SUCCESS, user); //返回的响应实体具体看下节 }}对于上面的代码来说,还可以做进一步的优化,由于所有的 Restful 接口都只是返回数据,所以我们可以直接在类级别上添加 @ResponseBody 注解。而大多数情况下,@Controller 与 @ResponseBody 又会一起使用,所以我们使用 @RestController 注解来替换掉它们,从而更加简洁地实现功能。
2. 接口规范
对于每一家公司来说,都会定义自己的数据规范,一个统一且标准的数据规范对于系统维护来说是非常重要的,也在很在程度上提升了开发效率。
2.1 响应报文规范
接口响应至少需要告诉使用方三项信息:状态码、描述、数据。其中,数据不是每个接口必须的,如果只是一个简单修改的动作,可能就没有必须返回数据了。下面我们定义一个 RespEntity类来封装我们的响应报文model:
public class RespEntity { private int code; private String msg; private Object data; public RespEntity(RespCode respCode) { this.code = respCode.getCode(); this.msg = respCode.getMsg(); } public RespEntity(RespCode respCode, Object data) { this(respCode); this.data = data; } ... }同时,定义一个枚举类来维护我们的状态码:
public enum RespCode { SUCCESS(0, "请求成功"), WARN(-1, "网络异常,请稍后重试"); private int code; private String msg; RespCode(int code, String msg) { this.msg = msg; } public int getCode() { return code; } public String getMsg() { return msg; }}这样,我们的响应数据规范已基本建立。
2.2 请求数据规范
响应报文格式我们已经定义好了,那么请求数据我们如何接收呢?
一般来说,请求与响应会使用相同的报文形式。如果响应为Json,那么请求也建议使用Json。
为登录请求添加输入参数,首先,需要我们定义好用户实体User类,直接在映射方法login() 使用该实体进行参数接收,并将接收到的参数直接返回,1.节代码已实现。
调出Postman,填写正确的Url,选择POST方式发送请求,选择Body,将 Content-Type 设置成 application/json,填入 Json 格式的请求数据,点击 Send 即可得到如下结果。
数据接收非常成功,但在上面的响应报文中,存在着了一个非常严重的问题,那就是用户的密码也随同用户信息一起返回给了客户端,显然这并不是一种正确的做法。
我们需要对其进行一次过滤,由于 SpringBoot 默认使用 Jackson 作为 Json 序列化工具,如果想要过滤掉响应中的某些字段,只需在过滤字段对应的 get 方法上加上 @JsonIgnore 注解即可。
但这样又会引发另外一个问题,那就是请求中的字段也被过滤掉了,对于这种问题,可以采用抽离请求参数模型的方式进行处理,即自定义一套参数接收的 Model,比如,接收用户登录的会使用 ReqUser 来进行参数接收,这样使得请求参数模型与数据库映射实体完全分离,在一定程度上提升了系统的安全性。替换成 Model 对象后(1.节的代码已经替换好了),我们就可以在数据库映射实体 User 上增加 @JsonIgnore 注解忽略该字段的序列化,而不影响请求参数的输入。
3. 参数校验
出于系统健壮性的考虑,我们需要对所有的参数进行必要性校验,如:登录请求时,如果没有用户名,程序应该立即驳回该请求。上面请求参数模型(Model)的抽象也使得我们对数据校验更加方便,当然主要还是依赖于 SpringBoot 的 Validate 功能的强大支持。
3.1. 简单参数校验
对于登录接口来说,用户名与密码都是必输的,那么我们现在为其添加上对应的参数校验,无需 if-else 判断,简单的几个注解就可以帮助我们完成所有的工作。
public class LoginController { @RequestMapping("/login") @ResponseBody public RespEntity login(@RequestBody @Valid ReqUser reqUser) { }}----public class ReqUser { @NotBlank(message = "用户名不能为空") public String getName() { return name; } @NotBlank(message = "密码不能为空") public String getPassword() { return password; } ...}我们为请求参数的 Model 对象ReqUser 加上了 @Valid 注解,并在 Model 类中对需要校验字段的 get 方法上添加相应的校验注解。效果如下:
3.2. 复杂参数校验
正则表达式校验
如果用户的登录名为手机号,那么就需要对登录名的格式做进一步的校验,下面使用正则表达式来校验手机号的合法性。
@NotBlank(message = "用户名不能为空")@Pattern( regexp = "1(([38]\\d)|(5[^4&&\\d])|(4[579])|(7[0135678]))\\d{8}", message = "手机号格式不合法")public String getUsername() { return username;}自定义校验注解
在系统使用过程中,有很多地方需要对手机号的格式进行校验,如:注册、验证码发送等。
但校验手机号的正则表达式又过于复杂,如果多处编写,一旦运营商增加某个号段,对程序的维护人员来说就是一个噩耗。这时,可以使用自定义校验注解来代替这些常用的校验。
手机号校验注解 Phone:
@Constraint(validatedBy = PhoneValidator.class)@Target({ElementType.METHOD, ElementType.FIELD})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface Phone { String message() default "手机号格式不合法"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {};}手机号校验实现类 PhoneValidator:
public class PhoneValidator implements ConstraintValidator<Phone, String> { private Pattern pattern = Pattern.compile("1(([38]\\d)|(5[^4&&\\d])|(4[579])|(7[0135678]))\\d{8}"); @Override public void initialize(Phone phone) { } @Override public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) { return pattern.matcher(value).matches(); }}Model 上的使用:
@Phonepublic String getUsername() { return username;}这样的话,如果因为某些不可抗拒因素导致校验规则的变动,只需要修改一处理即可,维护成本大大降低。
4. Xml 报文
大多数情况下,使用 Json 就可以满足我们的需求了,但仍然存在某些特定的场景需要使用到 XML 形式的报文,如:微信公众号开发。不过不用担心,切换成 XML 报文也只需要做轻微的改动,添加相关依赖如下:"com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.8.8"
然后就可以开始进行测试了,此处借助一个模拟 HTTP 请求工具(Postman)来协助我们测试该接口:
在上面的测试范例里,我们指定了 Accept 为 text/xml,这样 SpringBoot 就会返回 XML 形式的数据。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
最近在研究springboot实现FastJson解析json数据的方法,那么今天也算个学习笔记吧!添加jar包:com.alibabafastjson1.2.
Django之META与前后端交互1提交表单之GET前端提交数据与发送1)提交表单数据2)提交JSON数据后端的数据接收与响应1)接收GET请求数据2)接收PO
json数据交互1.为什么要进行json数据交互json数据格式在接口调用中、html页面中较常用,json格式比较简单,解析还比较方便。比如:webservi
本文实例讲述了jQuery向后台传入json格式数据的方法。分享给大家供大家参考。具体分析如下:前后台数据交互一般都用json格式,后台可以直接将json对应转
为什么使用JSON进行数据交互? JSON数据格式比较简单、解析比较方便,在接口调用及HTML页面Ajax调用时较常用。JSON交互方式请求是Key/Valu