美文网首页
Json Schema

Json Schema

作者: 欢欣的膜笛 | 来源:发表于2020-12-22 14:28 被阅读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,
          }
        })
      }
    }
    

    相关文章

      网友评论

          本文标题:Json Schema

          本文链接:https://www.haomeiwen.com/subject/afrrnktx.html