你不知道的JSON Schema

DejiaVu 等级 508 0 0

你不知道的JSON Schema

1、JSON?

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。具有简洁、可读性高、支持广泛的特点。

下面我们用JSON描述了一个商品的基本信息,包含了JSON的一些基本数据的类型 。

{
  "productId": 1,                  
  "productName": "HUAWEI Mate X2", 
  "price": 17999,                   
  "tags": [ "秒杀", "自营" ] 
}

2、Json Schema?

JSON Schema is a vocabulary that allows you to annotate and validate JSON documents.

JSON Schema是一个帮助你定义、校验甚至是修复json数据格式的解决方案。它定义了一整套规则,允许我们通过定义一个schema(本身也是JSON)来描述一个JSON串的数据格式。

下面我们通过Json Schem对上面的商品信息进行描述。同时明确我们需要约束的json属性。

{
  "type": "object",
  "title": "手机商品",
  "description": "手机商品详情",
  "properties": {
    "productId": {
      "description": "商品id",
      "type": "integer"
    },
    "productName": {
      "description": "商品名称",
      "type": "string"
    },
    "price": {
      "description": "商品价格",
      "type": "number",
      "exclusiveMinimum": 0
    },
    "tags": {
      "description": "商品标签",
      "type": "array",
      "items": {
        "type": "string"
      },
      "minItems": 1,
      "uniqueItems": true
    }
  },
  "required": ["productId", "productName", "price"]
}

我们来简单分析一下上面的JSON Schema

  • {}
{
  "type": "object",   // 约束对象是object,
  "title": "手机商品",  //
  "description": "手机商品详情",  //描述信息 非必须
  "properties": {
            ... // 这里是object中具体属性的约束
  },
  "required": ["productId", "productName", "price"] // 当前数据对象必须包含productId,productName,price三个字段
}
  • productId
"productId": {
      "description": "商品id",
      "type": "integer"  // 约束productid属性类型为整型
   }
  • productName
 "productName": {
      "description": "商品名称",
      "type": "string"  //约束productName属性类型为字符型
    },
  • price
"price": {
      "description": "商品价格", 
      "type": "number",  // 约束price属性类型为数字型,可以是整型或浮点型。
      "exclusiveMinimum": 0 // 约束该数字>0(不包含0)
    },
  • tags
 "tags": {
      "description": "商品标签",
      "type": "array", // 约束tag属性是数组
      "items": {
        "type": "string" // items是数组项约束,这里约束数组项均为字符型
      },
      "minItems": 1, // 约束该数组至少包含1项
      "uniqueItems": true // 约束数组中每项不得重复
    }

通过上面的例子,相信大家应该对Json Schema有了初步的了解。更多关于Json Schema关键词的的介绍大家可以参照 JSON Schema 规范

3、Json Schema 应用

1、数据校验。

在实际的业务开发中我们经常有对大量数据进行校验的场景。比如中后台系统中的表单提交、自动化接口测试等等。

这里推荐Ajv.js ,适用于Node.js和浏览器的高性能JSON验证器。

简单示例 CodePen

import Ajv from "ajv"
const ajv = new Ajv()
// JSON Schema
const schema = {
      ...
}
const validate = ajv.compile(schema)
// 待验证数据
const validData = {
   ...
}
const validResult = validate(validData)
if (validResult) {
  console.log('验证通过')
} else {
  console.log(validate.errors) // 错误详细信息
}
2、基于JSON Schema的表单自动生成方案。

上面对数据进行校验的例子是对是在数据输出端保证数据的正确性,有没有什么方式能在数据输入时就保证数据正确性呢?

我们通过对JSON Schema的观察可以发现,每一条Schema数据其实都可以对应一种表单UI的展示。表单的UI逻辑中保证在提交表单前,数据就是符合Schema规则的,表单验证通过后,得到的就是符合 Schema约束的 JSON 数据。

你不知道的JSON Schema

这里为大家推荐我在实际开发中调研过且在 github上start靠前的几个库。

1、react

2、vue

另外这几个库都支持开发者去实现自定义模板,将我们在业务开发中封装的表单组件扩展到JSON Schema的约束规范中。

3:其他好玩的库
  • typescript-json-schema

    通过在TypeScript文件中添加注释关键词。基于TS代码生成 JSON Schema。同时支持作为命令行工具使用和通过代码调用。

    接下来我们把上面的商品信息改用ts描述一下

    export interface Product {
      /**
       * @minimum 0
       * @TJS-type integer
       */
      productId: number;
      productName: string;
      /**
        * @exclusiveMinimum 0
        */
      price: number;
      /**
       *  @minItems 1
       *  @uniqueItems  true
       */
      tags: Array<string>
    }

    运行

    > npx typescript-json-schema 'index.ts' 'Product' -o test.json 

    可以得到我们上面定义商品的JSON Schema文件。

文章最后感谢大家阅读,如果你有更好的对JSON Schema的应用,欢迎在评论区留言讨论。

收藏
评论区

相关推荐

Hook 规则 – React
Hook 规则 _Hook_ 是 React 16.8 的新增特性。它可以让你在不编写 class 的情况下使用 state 以及其他的 React 特性。 Hook 本质就是 JavaScript 函数,但是在使用它时需要遵循两条规则。我们提供了一个 linter 插件(https://www.npmjs.com/package/
20 张图彻底弄懂 HTTPS 的原理
前言 近年来各大公司对信息安全传输越来越重视,也逐步把网站升级到 HTTPS 了,那么大家知道 HTTPS 的原理是怎样的吗,到底是它是如何确保信息安全传输的?网上挺多介绍 HTTPS,但我发现总是或多或少有些点有些遗漏,没有讲全,今天试图由浅入深地把 HTTPS 讲明白,相信大家看完一定能掌握 HTTPS 的原理,本文大纲如下: HTTP 为什么不安全
巨大提升!更快的 async 函数和 promises
(https://imghelloworld.osscnbeijing.aliyuncs.com/669a1c8f7203559afa4621628303674c.png) 翻译自:Faster async functions and promises(https://v8.dev/blog/fastasync) JavaScript
Python中JSON的基本使用_Just do it !
JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式。Python3 中可以使用 json 模块来对 JSON 数据进行编解码,它主要提供了四个方法: dumps、dump、loads、load。 dump和dumps dump和dumps对python对象进行序列化。将一个Python对象
数据库编程 MySQL 常见异常和解决办法
1.mysqlslap性能测试 unknown variable 'defaultcharactersetutf8' mysqlslap 可以用于模拟服务器的负载,并输出计时信息。测试时,可以指定并发连接数,可以指定 SQL 语句。如果没有指定 SQL 语句,mysqlslap 会自动生成查询 schema 的 SELECT 语句。但是可能会报错 m
你不知道的JSON Schema
1、JSON?JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。具有简洁、可读性高、支持广泛的特点。下面我们用JSON描述了一个商品的基本信息,包含了JSON的一些基本数据的类型 。json{ "productId": 1, "
MySQL8.0 json 使用 类型 查询 函数_denglei的博客
一,对记录的操作1.创建有json字段的表 创建表CREATE TABLE t_json(id INT PRIMARY KEY, sname VARCHAR(20) , info JSON);2.插入记录 插入含有json数组的记录 INSERT INTO t_json(id,sname,info) VAL
Android如何解析json字符串
前言上一篇文章介绍了服务器用Golang如何解析json字符串,今天我们来看看Android客户端是如何解析json字符串的。 正文Golang如何解析post请求中的json字符串(https://www.helloworld.net/p/O917HGeiALU2D)使用java语句如何正确解析json字符串呢?举一个例子,假如我们想从rtc_i
一篇长文带你在python里玩转Json数据
↑一个宝藏公众号,长的好看的人都关注了 Json简介 Json(JavaScript Object Notation) 很多网站都会用到Json格式来进行数据的传输和交换,就像上篇我提到的,它们返回的数据都是Json格式的。这因为Json是一种轻量级的数据交换格式,具有数据格式简单,读写方便易懂等很多优点。用它来进行前后端的数据传输,大
Python操作MongoDB
前言MongoDB是由C++语言编写的非关系型数据库,是一个基于分布式文件存储的开源数据库系统,其内容存储形式类似JSON对象,非常适合 JSON 数据存储,故受到广大爬虫程序员的青睐。现在,我们就来看看Python3下MongoDB的存储操作。 准备工作请确保已经安装好了MongoDB并启动了服务。可以参考https://www.helloworld.ne
京东面试官:呦,你对中间件 Mycat了解的还挺深~
1.数据切分概念数据的切分根据其切分规则的类型,可以分为两种切分模式。一种是按照不同的表(或者Schema)来切分到不同的数据库(主机)](https://jq.qq.com/?wv1027&k0IsBuUb0)之上,这种切可以称之为数据的垂直(纵向)切分;另外一则是根据表中的数据的逻辑关系,将同一个表中的数据按照某种条件拆分到多台数据库(主机)上面,这种切
https://cloud.tencent.com/developer/article/write/1830331
一、目标今天的目标是这个sign和appcode 二、步骤 Jadx没法上了app加了某梆的企业版,Jadx表示无能为力了。 FRIDADEXDumpDexDump出来,木有找到有效的信息。 Wallbreaker葫芦娃的Wallbreaker可以做些带壳分析,不过这个样本,用Frida的Spawn模式可以载入,Attach模式会失败。而直接用Objecti
面试字节跳动Java工程师该怎么准备?值得收藏!
性能调优影响MySQLServer 性能的相关因素1. 商业需求对性能的影响2. 系统架构及实现对性能的影响3. Query语句对系统性能的影响4. Schema设计对系统的性能影响5. 硬件环境对系统性能的影响MySQL 数据库锁定机制1. MySQL锁定机制简介2. 各种锁定机制分析3. 合理利用锁机制优化MySQLMySQL数据库Que
一篇文章带你了解JavaScript类型转换
类型转换是一种将一种数据类型转换为另一种数据类型的方法。一、运算符的类型typeof运算符可以帮助你找到你的变量的类型。typeof运算符返回一个变量或表达式的类型。例:项目 JavaScript typeof运算符 typeof运算符返回变量或表达式的类型:document.write(typeof "" + "" +typeof "Json" + ""
javascript实践教程-01-javascript介绍
本节目标1. 了解javascript是什么。2. 了解javascript能干什么。 内容摘要本篇介绍了javascript是什么,为什么要用javascript,ECMAScript标准是什么等。阅读时间大约510分钟。 javascript是什么?javascript是世界上最流行的脚本语言,因为你在电脑、手机、平板上浏览的所有的网页,以及无数基于HT

热门文章

最新文章