【问题标题】:AJV custom keyword validationAJV 自定义关键字验证
【发布时间】:2017-08-06 18:16:29
【问题描述】:

我正在使用 AJV 库来验证我的 JSON 架构。我希望能够验证 Startdate 是一个字符串。如果不是字符串,则应转换为N/A。目前,它仅将undefined 转换为N/A

但是,在这些情况下,它不会按预期工作:

  • null -> “空”
  • 0 --> "0"
  • 真-->“真”

如果我希望将以上所有内容都转换为 N/A 字符串,我的 customKeyword 函数会是什么样子?

JSON 响应:

jsonResponse: {
  "Issue": {
    "StartDate": "December 17, 1995 03:24:00"
  }
}

架构:

var ajv = new Ajv({
    useDefaults: true,
    coerceTypes: 'undefined'
});

const schema = {
    "type": "object",
    "properties": {
        "Issue": {
            "type": "object",
            "properties": {
                "StartDate": {
                    "type": "string"
                    "default": "N/A",
                    "stringTypeChecker"
                }
            }
        }
    }
}

添加关键字函数:

ajv.addKeyword('stringTypeChecker', {
  modifying: true,
  validate: function(){
    let foo = []
    console.log(foo)
  }
});

var valid = ajv.validate(schema, jsonResponse);

【问题讨论】:

    标签: javascript json validation jsonschema ajv


    【解决方案1】:

    你不需要 coerceTypes 选项。

    关键字必须是:

    ajv.addKeyword('stringTypeChecker', {
      modifying: true,
      schema: false, // keyword value is not used, can be true
      valid: true, // always validates as true
      validate: function(data, dataPath, parentData, parentDataProperty){
        if (typeof data != 'string' && parentData) // or some other condition
          parentData[parentDataProperty] = 'N/A';
      }
    });
    

    架构:

    {
      "type": "object",
      "properties": {
        "Issue": {
          "type": "object",
          "properties": {
            "StartDate": {
              "type": "string",
              "default": "N/A",    
              "stringTypeChecker": true
            }
          }
        }
      }
    }
    

    【讨论】:

    • 结束日期的模式值是否会引用stringTypeChecker?换句话说,我需要如何更改架构以使用 stringTypeChecker 关键字?
    • "stringTypeChecker" 应该是具有任何值的架构属性之一(例如true
    • stringTypeChecker 内部的validate 方法接受四个参数,但您没有在条件逻辑中使用dataPath。这就是我如何调用stringTypeChecker --> var validate = ajv.compile(JSON_SCHEMA); var valid = ajv.validate(responseJson, responseJson["Issue"], "StartDate" ); 在幕后我观察到 validate 方法需要所有四个参数。由于validate 不使用dataPath,有没有办法改变验证函数中预期的参数数量?感谢您的及时回复。
    • 不确定我是否理解您需要更改参数的原因。它是记录在案的 api - 请参阅自定义关键字文档。
    • 顺便说一句,您没有正确使用它,请参阅文档(入门)
    猜你喜欢
    • 2018-05-17
    • 2018-08-25
    • 2019-04-03
    • 1970-01-01
    • 1970-01-01
    • 2011-05-27
    • 1970-01-01
    • 1970-01-01
    • 2017-04-20
    相关资源
    最近更新 更多