用 Json-Schema 来验证你的请求参数

简介: Json-Schema 是一个用来验证、描述 Json 数据的一个标准,它可以用来验证你的请求数据是否和你定义的 Schema 是否一致。

网络异常,图片无法展示
|


简介

Json-Schema 是一个用来验证、描述 Json 数据的一个标准,它可以用来验证你的请求数据是否和你定义的 Schema 是否一致。比如下面的 Json 数据中:

{
  "name":"greycode",
  "desc":"coder"
}

如果不预先告诉你字段的含义,你知道 name 是什么意思吗?它到底是指人名还是一个物品的名字还是其他?desc 又是什么意思呢?

这时候,就可以用 Json-Schema 来描述它了

{
    "$schema": "http://json-schema.org/draft-07/schema",
    "$id": "http://example.com/example.json",
    "type": "object",
    "title": "这是一个Json数据",
    "description": "描述个人信息的数据",
    "required": [
        "name",
        "desc"
    ],
    "properties": {
        "name": {
            "type": "string",
            "description": "人的姓名",
        },
        "desc": {
            "type": "string",
            "description": "个人简介",
        }
    }
}

上面我们用 Json-Schema 来描述了刚开始的 Json 数据,这样就可以清楚的知道 name 是人的姓名,desc 是个人简介,在也不用自己去猜了。

Json Schema 字段说明

在上面的 Json-Schema 数据中,每个字段都有其的含义

  • $schema :主要用于版本控制
  • $id :定义字段在 schema 中的地址
  • titledescription :用于描述和说明 Schema 的作用
  • type :定义字段的数据类型
  • required :Json 数据中包含的字段
  • ......

由于 Json-Schema 有许多草案,每个草案的字段都有一点区别,具体可以看一下的草案资料:

  1. 草案 2019-09 迁移 草案 2020-12
  2. 草案-07 迁移 草案 2019-09
  3. 草案-06 迁移 草案-07
  4. 草案-04 迁移 草案-06 文档说明
  5. 所有草案版本文档

使用 Json-Schema 验证 Json 数据

网络异常,图片无法展示
|

Json-Schema 支持多种语言的验证器,一般都是第三方实现的,这里我们使用 Java 验证器来验证一个 Json 数据,Java 验证器这里选用了 everit-org/json-schema 验证器来使用,不过它最高支持到草案7,像最新的草案2020-12它是不支持的。

Java 验证 Json 数据

导入依赖:

<dependency>
    <groupId>com.github.everit-org.json-schema</groupId>
    <artifactId>org.everit.json.schema</artifactId>
    <version>1.13.0</version>
</dependency>
...
<repositories>
    <repository>
        <id>jitpack.io</id>
        <url>https://jitpack.io</url>
    </repository>
</repositories>

导入所需依赖,由于这个包没有上传到中央仓库,所以要设置仓库地址

代码实现:

导入依赖后就可以用代码来实现一个使用 Json-Schema 验证 Json 数据的功能了

try {
  String jsonSchema = "{\n" +
    "    \"$schema\": \"http://json-schema.org/draft-07/schema\",\n" +
    "    \"$id\": \"http://example.com/example.json\",\n" +
    "    \"type\": \"object\",\n" +
    "    \"title\": \"这是一个Json数据\",\n" +
    "    \"description\": \"描述个人信息的数据\",\n" +
    "    \"required\": [\n" +
    "        \"name\",\n" +
    "        \"desc\"\n" +
    "    ],\n" +
    "    \"properties\": {\n" +
    "        \"name\": {\n" +
    "            \"type\": \"string\",\n" +
    "            \"description\": \"人的姓名\",\n" +
    "        },\n" +
    "        \"desc\": {\n" +
    "            \"type\": \"string\",\n" +
    "            \"description\": \"个人简介\",\n" +
    "        }\n" +
    "    }\n" +
    "}";
  JSONObject jsonObject = new JSONObject(new JSONTokener(jsonSchema));
  Schema schema = SchemaLoader.load(jsonObject);
  schema.validate(new JSONObject("{\n" +
                                 "  \"name\":\"greycode\",\n" +
                                 "  \"desc\":\"coder\"\n" +
                                 "}"));
}catch (Exception e){
  System.out.println("验证异常:"+e.getMessage());
}

这里用了上面的 Json 数据和 Json-Schema,当验证通过时,不会有任何输出,同时也没有任何异常。

当我们把 desc 的数据改为如下数据时:

{
  "name":"greycode",
  "desc":1
}

此时由于 desc 的数据类型变为了数字类型,所以我们就可以捕获到异常并输出:验证异常:#/desc: expected type: String, found: Integer

目录
相关文章
|
1月前
|
JSON 数据格式 Python
Python编程:利用JSON模块编程验证用户
Python编程:利用JSON模块编程验证用户
|
3月前
|
JSON Java API
【Azure Developer】如何验证 Azure AD的JWT Token (JSON Web 令牌)?
【Azure Developer】如何验证 Azure AD的JWT Token (JSON Web 令牌)?
|
5月前
|
JSON 数据格式 微服务
.NET下 支持大小写不敏感的JSON Schema验证方法
有很多应用程序在验证JSON数据的时候用到了JSON Schema。 在微服务架构下,有时候各个微服务由于各种历史原因,它们所生成的数据对JSON Object属性名的大小写规则可能并不统一,它们需要消费的JSON数据的属性名可能需要大小写无关。 遗憾的是,目前的JSON Schema没有这方面的标准,标准中都是大小写敏感的。在类似上述情况下,这给使用JSON Schema进行数据验证造成了困难。
|
Web App开发 JSON API
postman测试post请求参数为json类型
postman测试post请求参数为json类型
270 0
postman测试post请求参数为json类型
|
JSON 前端开发 API
Scrapy框架-模拟登录之JWT验证及post特殊格式数据(json)
一、背景 之前有记录过普通的scrapy模拟登录,这种方法可以满足了日常爬虫的登录需求。 但是技术一直在进步,近几年前后端分离的趋势越来越好,很多web都采用前后端分离的技术。
2133 0
|
XML JSON JavaScript
iOS网络请求指南: 请求参数的拼接(签名)、返回参数解析(JSON/XML解析)、案例(条码支付综合前置平台申请退款)
iOS网络请求指南: 请求参数的拼接(签名)、返回参数解析(JSON/XML解析)、案例(条码支付综合前置平台申请退款)
421 0
iOS网络请求指南: 请求参数的拼接(签名)、返回参数解析(JSON/XML解析)、案例(条码支付综合前置平台申请退款)
|
JSON 数据安全/隐私保护 Android开发
我的Android进阶之旅------&gt;android如何将List&lt;NameValuePair&gt;请求参数列表转换为json格式
本文同步发表在简书,链接:http://www.jianshu.com/p/395a4c8b05b9 前言 由于接收原来的老项目并进行维护,之前的http请求是使用Apache Jakarta Common下的子项目HttpClient,因此使用了 List ...
1044 0
|
24天前
|
数据采集 JSON 数据处理
抓取和分析JSON数据:使用Python构建数据处理管道
在大数据时代,电商网站如亚马逊、京东等成为数据采集的重要来源。本文介绍如何使用Python结合代理IP、多线程等技术,高效、隐秘地抓取并处理电商网站的JSON数据。通过爬虫代理服务,模拟真实用户行为,提升抓取效率和稳定性。示例代码展示了如何抓取亚马逊商品信息并进行解析。
抓取和分析JSON数据:使用Python构建数据处理管道
|
10天前
|
JSON 数据格式 索引
Python中序列化/反序列化JSON格式的数据
【11月更文挑战第4天】本文介绍了 Python 中使用 `json` 模块进行序列化和反序列化的操作。序列化是指将 Python 对象(如字典、列表)转换为 JSON 字符串,主要使用 `json.dumps` 方法。示例包括基本的字典和列表序列化,以及自定义类的序列化。反序列化则是将 JSON 字符串转换回 Python 对象,使用 `json.loads` 方法。文中还提供了具体的代码示例,展示了如何处理不同类型的 Python 对象。
|
14天前
|
JSON 缓存 前端开发
PHP如何高效地处理JSON数据:从编码到解码
在现代Web开发中,JSON已成为数据交换的标准格式。本文探讨了PHP如何高效处理JSON数据,包括编码和解码的过程。通过简化数据结构、使用优化选项、缓存机制及合理设置解码参数等方法,可以显著提升JSON处理的性能,确保系统快速稳定运行。