Проверка пользовательского ключевого слова AJV

Я использую библиотеку 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"
                }
            }
        }
    }
}

Функция addKeyword:

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

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

person eagercoder    schedule 15.03.2017    source источник


Ответы (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
        }
      }
    }
  }
}
person esp    schedule 15.03.2017
comment
Будет ли значение схемы даты закрытия ссылкой на stringTypeChecker? Другими словами, как мне нужно изменить мою схему, чтобы использовать ключевое слово stringTypeChecker? - person eagercoder; 15.03.2017
comment
stringTypeChecker должен быть одним из свойств схемы с любым значением (например, true) - person esp; 16.03.2017
comment
Метод validate внутри stringTypeChecker принимает четыре параметра, но вы не используете dataPath в условной логике. Вот как я вызываю stringTypeChecker - ›var validate = ajv.compile(JSON_SCHEMA); var valid = ajv.validate(responseJson, responseJson["Issue"], "StartDate" ); Под капотом я заметил, что метод проверки ожидает все четыре параметра. Есть ли способ изменить количество параметров, ожидаемых в функции проверки, поскольку validate не использует dataPath? Спасибо за пунктуальные ответы. - person eagercoder; 16.03.2017
comment
Не уверен, что понимаю, зачем нужно менять параметры. Это API, который задокументирован - см. Документацию по пользовательским ключевым словам. - person esp; 16.03.2017
comment
вы используете его неправильно, кстати, см. документацию (Начало работы) - person esp; 16.03.2017
comment
Хорошо, когда вы используете синтаксис adSchema, вам не нужно использовать метод compile: - person eagercoder; 16.03.2017