你不知道的JSON Schema

DejiaVu
• 阅读 1513

你不知道的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的应用,欢迎在评论区留言讨论。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Karen110 Karen110
3年前
一篇文章带你了解JavaScript日期
日期对象允许您使用日期(年、月、日、小时、分钟、秒和毫秒)。一、JavaScript的日期格式一个JavaScript日期可以写为一个字符串:ThuFeb02201909:59:51GMT0800(中国标准时间)或者是一个数字:1486000791164写数字的日期,指定的毫秒数自1970年1月1日00:00:00到现在。1\.显示日期使用
Wesley13 Wesley13
3年前
java将前端的json数组字符串转换为列表
记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
JavaWeb 之 JSON
一、概述  1、概念JSON:JavaScriptObjectNotation JavaScript对象表示法  2、基本格式varp{"name":"张三","age":23,"sex":"男"};  3、用途和优点(1)json现在多用于存储
Stella981 Stella981
3年前
Gson之实例五
前面四篇博客基本上可以满足我们处理的绝大多数需求,但有时项目中对json有特殊的格式规定.比如下面的json串解析:{"tableName":"students","tableData":{"id":1,"name":"李坤","birthDay":"Jun 22, 2012 9:54:49 PM"},{"id":2,"name":"曹贵生"
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
DejiaVu
DejiaVu
Lv1
已经在原地冲你的背影挥累了手
文章
1
粉丝
1
获赞
1
热门文章

暂无数据