使用 AJV 的 json 模式中的空值验证

Posted

技术标签:

【中文标题】使用 AJV 的 json 模式中的空值验证【英文标题】:Empty values validation in json schema using AJV 【发布时间】:2018-02-03 22:11:20 【问题描述】:

我正在使用 Ajv 来验证我的 JSON 数据。我无法找到将空字符串验证为键值的方法。我尝试使用模式,但它没有抛出适当的消息。

这是我的架构


    "type": "object",
    "properties": 
        "user_name":  "type": "string" , "minLength": 1,
        "user_email":  "type": "string" , "minLength": 1,
        "user_contact":  "type": "string" , "minLength": 1
    ,
    "required": [ "user_name", 'user_email', 'user_contact']

我正在使用 minLength 来检查该值是否应包含至少一个字符。但它也允许空白空间。

【问题讨论】:

【参考方案1】:

目前 AJV 中没有内置选项可以这样做。

【讨论】:

【参考方案2】:

你可以这样做:

ajv.addKeyword('isNotEmpty', 
  type: 'string',
  validate: function (schema, data) 
    return typeof data === 'string' && data.trim() !== ''
  ,
  errors: false
)

在 json 架构中:


  [...]
  "type": "object",
  "properties": 
    "inputName": 
      "type": "string",
      "format": "url",
      "isNotEmpty": true,
      "errorMessage": 
        "isNotEmpty": "...",
        "format": "..."
      
    
  

【讨论】:

errors: false在这里面有什么意义。从规格中找不到【参考方案3】:

我找到了另一种方法,使用带有“maxLength”的“not”关键字:


  [...]
  "type": "object",
  "properties": 
    "inputName": 
      "type": "string",
      "allOf": [
        "not":  "maxLength": 0 , "errorMessage": "...",
        "minLength": 6, "errorMessage": "...",
        "maxLength": 100, "errorMessage": "...",
        "..."
      ]
    ,
  ,
  "required": [...]

不幸的是,如果有人用空格填充该字段,它将是有效的,因为空格算作字符。这就是为什么我更喜欢 ajv.addKeyword('isNotEmpty', ...) 方法的原因,它可以在验证之前使用 trim() 函数。

干杯!

【讨论】:

【参考方案4】:

现在可以使用ajv-keywords 来实现。 它是可用于 ajv 验证器的自定义模式的集合。

将架构更改为


  "type": "object",
  "properties": 
    "user_name": 
      "type": "string",
      "allOf": [
        
          "transform": [
            "trim"
          ]
        ,
        
          "minLength": 1
        
      ]
    ,
   // other properties
  

使用 ajv 关键字

const ajv = require('ajv');
const ajvKeywords = require('ajv-keywords');
const ajvInstance = new ajv(options);
ajvKeywords(ajvInstance, ['transform']);

transform 关键字指定在验证之前要执行的转换。

【讨论】:

以上是关于使用 AJV 的 json 模式中的空值验证的主要内容,如果未能解决你的问题,请参考以下文章

Ajv:使用动态键验证 json

基于数据的 ajv 条件模式验证

对象数组的 AJV 模式验证

为啥 Ajv 在编译期间无法解析引用?

AJV 架构验证失败

Azure 数据工厂数据流不存在 JSON 格式的空值