2017-03-15 278 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