2017-03-15 43 views
1

我正在使用AJV库来验证我的JSON模式。我希望能够验证Startdate是一个字符串。在不是字符串的情况下,应将其转换为N/A。目前,它仅将undefined转换为N/AAJV自定义关键字验证

然而,在这些情况下,它也不会达到预期效果:

  • 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"} 
      } 
      } 
     } 
     } 

addKeyword功能:

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

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

回答

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 
     } 
     } 
    } 
    } 
} 
+0

会截止日期的模式值,是'stringTypeChecker'参考?换句话说,我将如何改变模式,使用'stringTypeChecker'关键字? – eagercoder

+1

“stringTypeChecker”应该是具有任何值的模式属性之一(例如'true') – esp

+0

'stringTypeChecker'中的validate'方法有四个参数,但是在条件逻辑中不使用'dataPath'。这是我怎样调用'stringTypeChecker' - > '变种的validate = ajv.compile(JSON_SCHEMA);' '变种有效= ajv.validate(responseJson,responseJson [ “问题”],'' ” StartDate“);' 在引擎盖下我观察到validate方法需要所有四个参数。有没有办法改变validate函数中期望的参数数量,因为'validate'不使用'dataPath'? 谢谢您的准时回复。 – eagercoder