SpringBoot学习之Json数据交互的方法

JSON知识讲解

JSON的定义

JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

解释来自于百度百科,说简单点。JSON就是一串字符串 只不过元素会使用特定的符号标注。

JSON的几种常见格式

对象

{
"username": "清风一阵吹我心",
"password": "123456"
}

数组

[
"one",
"two",
"three"
]

对象数组

{
"student": [
"张三",
"李四",
"王五"
],
"teacher": [
"语文",
"数学",
"英语"
]
}

数组对象

[
{
"username": "张三",
"age": 18
},
{
"username": "李四",
"age": 20
}
]

复杂的格式

{
 "msg": "查询成功",
 "code": 200,
 "data": {
  "provinces": [
   {
    "name": "重庆",
    "cities": [
     {
      "name": "重庆市",
      "district": [
       "江北区",
       "渝北区",
       "万州区",
       "合川区"
      ]
     }
    ]
   },
   {
    "name": "北京",
    "cities": [
     {
      "name": "北京市",
      "district": [
       "海淀区",
       "昌平区",
       "朝阳区",
       "丰台区"
      ]
     }
    ]
   }
  ]
 }
}

使用JSON的好处

  • 与XML相比,数据格式比较简单, 易于读写
  • 格式都是压缩的, 占用带宽小
  • 便于服务器端的解析,支持多种语言。包括C,C#,Java,JavaScript, Perl,php,Python,Ruby等。

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)
@Documented
public @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 上的使用:

@Phone
public 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 形式的数据。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • SpringBoot返回json和xml的示例代码

    有些情况接口需要返回的是xml数据,在springboot中并不需要每次都转换一下数据格式,只需做一些微调整即可. 新建一个springboot项目,加入依赖jackson-dataformat-xml,pom文件代码如下: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=&qu

  • springboot json时间格式化处理的方法

    application.properties中加入如下代码 springboot 默认使用 jackson 解析 json spring.jackson.date-format=yyyy-MM-dd HH:mm:ss spring.jackson.time-zone=GMT+8 如果个别实体需要使用其他格式的 pattern,在实体上加入注解即可 import org.springframework.format.annotation.DateTimeFormat; import com.fas

  • Spring Boot使用FastJson解析JSON数据的方法

    个人使用比较习惯的json框架是fastjson,所以spring boot默认的json使用起来就很陌生了,所以很自然我就想我能不能使用fastjson进行json解析呢? 1.引入fastjson依赖库: <!--添加fastjson解析JSON数据--> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <versio

  • Spring Boot 从静态json文件中读取数据所需字段

    •在实体中,通常使用类似字典表的文件来表示属性,文件大都配置在配置文件中,也可以是静态文件,本次记录如何从静态json文件中读取所需字段. 1.文件格式以及路径 2.加载文件 import org.springframework.beans.factory.annotation.Value; import org.springframework.core.io.Resource; @Value("classpath:static/data/area.json") private Res

  • SpringBoot之返回json数据的实现方法

    一.创建一个springBoot个项目 操作详情参考:1.SpringBoo之Helloword 快速搭建一个web项目 二.编写实体类 /** * Created by CR7 on 2017-8-18 返回Json数据实体类 */ public class User { private int id; private String username; private String password; public String getPassword() { return password;

  • springboot openfeign从JSON文件读取数据问题

    对openfeign不清楚的同学可以参考下我的这篇文章:springboot~openfeign从此和httpClient说再见 对于openfeign来说,帮助我们解决了服务端调用服务端的问题,你不需要关心服务端的URI,只需要知道它在eureka里的服务名称即可,同时你与服务端确定了服务方法的参数和返回值之后,我们可以在单元测试时mock这些服务端方法即可,真正做到了单元测试,而不需要与外界资源进行交互. 今天主要说一下在openfeign里读取JSON文件的问题,我们将测试所需要的数据存储

  • springboot+jsonp解决前端跨域问题小结

    现在咱们一起来讨论浏览器跨域请求数据的相关问题.说这样可能不是很标准,因为拒绝跨域请求数据并不是浏览器所独有的,之所以会出现跨域请求不了数据,是因为浏览器基本都实现了一个叫"同源策略"的安全规范.该规范具体是什么呢?我们在MDN上找到了一份资料,地址如下: 浏览器同源策略讲解 总的来说,当A网址和B网址在 协议 . 端口 . 域名 方面存在不同时,浏览器就会启动同源策略,拒绝A.B服务器之间进行数据请求. 说了同源策略,纸上得来终觉浅,绝知此事要躬行,到底同源策略是怎么体现的呢?下面我

  • SpringBoot使用自定义json解析器的使用方法

    Spring-Boot是基于Spring框架的,它并不是对Spring框架的功能增强,而是对Spring的一种快速构建的方式. Spring-boot应用程序提供了默认的json转换器,为Jackson.示例: pom.xml中dependency配置: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  • SpringBoot学习之Json数据交互的方法

    JSON知识讲解 JSON的定义 JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式.它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据.简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言. 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率. 解释来自于百度百科,说简单点.JSON就是一串字符串 只不过元素会使用特定的符号标注. JSON

  • SpringBoot前后端json数据交互的全过程记录

    目录 一.参考文献 二.勇敢尝试 三.最终选择交互方式 总结 一.参考文献 原生Ajax与JQuery Ajax SpringMVC接受JSON参数详解及常见错误总结 提交方式为 POST 时, JQuery Ajax 以 application/x-www-form-urlencoded 上传 JSON对象 , 后端用 @RequestParam 或者Servlet 获取参数. JQuery Ajax 以 application/json 上传 JSON字符串, 后端用 @RquestBody

  • 详解springmvc之json数据交互controller方法返回值为简单类型

    当controller方法的返回值为简单类型比如String时,该如何与json交互呢? 使用@RequestBody 比如代码如下: @RequestMapping(value="/ceshijson",produces="application/json;charset=UTF-8") @ResponseBody public String ceshijson(@RequestBody String channelId) throws IOException{

  • ASP.NET MVC 4 中的JSON数据交互的方法

    前台Ajax请求很多时候需要从后台获取JSON格式数据,一般有以下方式: 拼接字符串 return Content("{\"id\":\"1\",\"name\":\"A\"}"); 为了严格符合Json数据格式,对双引号进行了转义. 使用JavaScriptSerialize.Serialize()方法将对象序列化为JSON格式的字符串 MSDN 例如我们有一个匿名对象: var tempObj=new

  • SpringBoot实现前后端、json数据交互以及Controller接收参数的几种常用方式

    目录 前言 获取参数的几种常用注解 一.请求路径参数get请求 二.Body参数POST请求 四.HttpServletRequest 五.参数校检 最终选择交互方式 参考文献 总结 前言 现在大多数互联网项目都是采用前后端分离的方式开发,前端人员负责页面展示和数据获取,后端负责业务逻辑处理和接口封装.当与前端交互的过程当中,常用json数据与前端进行交互,这样想取出前端传送过来的json数据的时候,就需要用到@RequestBody这个注解.@RequestBody注解用于读取http请求的内

  • SpringBoot项目实战之数据交互篇

    目录 前言 1.数据格式 1.1.Json报文 1.2.Xml报文 2.接口规范 2.1.响应报文规范 2.2.请求数据规范 3.参数校验 3.1.简单参数校验 3.2.复杂参数校验 3.2.1.正则表达式校验 3.2.2.自定义校验注解 总结 前言 SpringBoot 非常适合 Web 应用开发,我们可以使用它轻松地建立一个 Web 服务.在Spring Boot入门 里面,我们已经使用其实现一个非常简单的接口,输出了 Hello World!下面我们模拟真实的场景来学习 SpringBoo

  • django和vue实现数据交互的方法

    我使用的是jQuery的ajax与django进行数据交互,遇到的问题是django的csrf 传输数据的方法如下: $(function() { $.ajax({ url: 'account/register', type: 'post', dataType:'json', data: $('#form1').serialize(), success: function (result) { console.log(result); if (result) { alert("result&qu

  • TP5(thinkPHP5)框架使用ajax实现与后台数据交互的方法小结

    本文实例讲述了TP5(thinkPHP5)框架使用ajax实现与后台数据交互的方法.分享给大家供大家参考,具体如下: 方法一: serialize() 方法通过序列化表单值,创建 URL 编码文本字符串,这个是jquery提供的方法 前端代码 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>ajax交互</title> <script s

  • 聊聊Spring MVC JSON数据交互的问题

    我们在开发中后端经常需要接受来自于前端传递的Json字符串数据,怎么把Json字符串转换为Java对象呢?后端也经常需要给前端返回Json字符串,怎么把Java对象数据转换为Json字符串返回呢? 回顾JSON JSON(JavaScript Object Notation) 各个JSON技术比较 早期 JSON 的组装和解析都是通过手动编写代码来实现的,这种方式效率不高,所以后来有许多的关于组装和解析 JSON 格式信息的工具类出现,如 json-lib.Jackson.Gson 和 Fast

随机推荐