Json Schema

2020-12-22  本文已影响0人  欢欣的膜笛

Json Schema

定义了一系列关键字,元数据通过这些关键字来描述 Json 数据的规范。

  1. type:定义了 Json 数据需要满足的类型要求
    string , object , number(数值,不区分整数、浮点数), integer(整数) , array , boolean , null

  2. 字符串

    • minLength, maxLength:字符串长度
    • pattern:正则表达式
    • format:可以通过 Json Schema 内建的一些类型,对字符串的格式做规范,例如电子邮件、日期、域名等。date, time, date-time, email, hostname
  3. 数值

    • multipleOf:数值满足倍数
    • minimum, maximum, exclusiveMinimum, exclusiveMaximum:数值范围,可以限制数值的方位,包括最大值、最小值、开区间最大值、开区间最小值。
  4. 数组:

    • items:对应嵌套的 Json Schema,要求数组内每个成员都是某种类型、对应数组,约束数组的每个成员的类型
    • additionalItemsboolean,当使用了 items 关键字且对应的是 Schema 数组,这个限制才起作用。关键字 additionalItems 规定 Json 数组内的元素,除了一一匹配 items 数组内的 Schema 外,是否还允许多余的元组。
    • minItems, maxItems:数组元素个数
    • uniqueItems:数组元素是否必须唯一
  5. 对象:

    • properties:规定对象各成原所应遵循的 Schema,是一个 key/value 结构的字典,其 key 对应 Json 数据中的 key,其 value 是一个嵌套的 Json Schema。表示 Json 数据中 key 对应的值所应遵守的 Json Schema
    • patternProperties:批量定义成员 Schema,与 properties 一样,但是 key 通过正则表达式匹配属性名。
    • required:数组,规定哪些对象成员是必须的。
    • dependencies:规定某些成员的依赖成员,不能在依赖成员缺席的情况下单独出现,属于数据完整性方面的约束。是一个字典结构,keyJson 数据的属性名,value 是一个数组。
    • additionaProperties:是否允许额外属性。
    • minProperties, maxProperties:属性个数的限制。
  6. 逻辑组合:

    • allOf:满足 allOf 数组中的所有 Json Schema
    • anyOf:满足 anyOf 数组中的任意个 Schema
    • oneOf:满足且仅满足 oneOf 数组中的一个 Schema,这也是与 anyOf 的区别。
    • not:告诉 Json 不能满足 not 所对应的 Schema
  7. 复杂结构

    • $id , $ref
  8. 通用关键字

    • enum:可以在任何 json schema 中出现,其 value 是一个 list,表示 json 数据的取值只能是 list 中的某个。
    • title,description,default,example:只作为描述作用,不影响对数据的校验。

ajv

一个非常流行的 JSON Schema 验证工具。
安装:npm install ajv -S , npm install ajv-errors -S
使用:

import Ajv from 'ajv'

const ajv = new Ajv({ allErrors: true })

require('ajv-errors')(ajv)

const schema = {
    // $schema: 'http://json-schema.org/schema#',
    type: 'object',
    required: ['userName', 'email', 'phone', 'password'],
    properties: {
        userName: {
            type: 'string',
            minLength: 4,
            maxLength: 8,
            errorMessage: {
                minLength: '用户名不得少于四个字符',
                maxLength: '用户名不得多于八个字符',
            },
        },
        email: {
            type: 'string',
            // 会报错,原因暂未找到
            // format: 'email',
            // errorMessage: {
            //     format: '请输入正确的邮箱',
            // },
        },
        phone: {
            type: 'string',
            pattern: '^1[0-9]{10}$',
            errorMessage: {
                pattern: '请输入正确的手机号',
            },
        },
        password: {
            type: 'string',
            minLength: 4,
            maxLength: 8,
            errorMessage: {
                minLength: '密码不得少于四个字符',
                maxLength: '密码不得多于八个字符',
            },
        },
    },
}

export {
    ajv,
    schema,
}
const data = {
  userName: '',
  email: '',
  phone: '',
  password: '',
}

const errorMsgObj = {}

const login = () => {
  const valid = ajv.validate(schema, data)
  if (!valid && ajv.errors && ajv.errors.length) {
    ajv.errors.forEach(item => {
      const key = item.dataPath.substr(1) as string
      errorMsgObj[key] = {
        isError: true,
        message: item.message,
      }
    })
  }
}
上一篇下一篇

猜你喜欢

热点阅读