Использование ajv для гарантии типов значений по определенным индексам в массиве - PullRequest
0 голосов
/ 07 июня 2018

Я пытаюсь использовать ajv, чтобы гарантировать, что массив придерживается строгих правил о том, что является допустимым значением.Я не уверен, какие модификации или дополнительные ключевые слова использовать, чтобы добиться результата, который я ищу.Можно использовать некоторые идеи.

Примечание: у меня это работает по-другому, без использования проверки JSONSchema.Мне было просто любопытно, можно ли использовать валидацию JSONSchema для достижения той же цели.

Правила таковы:

  1. Он может содержать любое количество элементов, нас интересуют только индексы 0 и1.
  2. Первый элемент, индекс 0, должен быть строкой.
  3. Второй элемент, индекс 1, должен быть объектом.
  4. Если элемент с индексом 0или 1, независимо от длины массива, является допустимым для любого индекса, вставьте значение по умолчанию для другого элемента в соответствующем индексе.
  5. Если в массиве нет элементов, вставьте оба значения по умолчанию в соответствующемindex.

Вот фрагмент кода, который, надеюсь, объясняет, чего я пытаюсь достичь.Благодарю.

const schema = {
    "type": "array",
    "items": [
        {
            "type": "string",
            "default": ""
        },
        {
            "type": "object",
            "default": {}
        }
    ]
};

function fn( array ) {

    ajv.validate( schema, array );
    console.log( array );

}

fn([]);
fn([ '1' ]);
fn([ { bar: 2} ]);
fn([ 'word', { foo: 3 } ]);
fn([ 'word', 42 ]);
fn([ [ 1, 2, 3 ],  { baz: 4 } ]);
fn([ 'word', { a: 1, b: 2 }, 42 ]);

// Actual results:

// [ '', {} ] => Expected
// [ '1', {} ] => Expected
// [ { bar: 2 }, {} ] => Not what I want
// [ 'word', { foo: 3 } ] => Expected
// [ 'word', 42 ] => Not what I want
// [ [ 1, 2, 3 ], { baz: 4 } ] => Not what I want
// [ 'word', { a: 1, b: 2 }, 42 ] => Expected, indices 0 and 1 are all I care about

// Desired results:

// [ '', {} ]
// [ '1', {} ]
// [ '1', { bar: 2 } ]
// [ 'word', { foo: 3 } ]
// [ 'word', {} ]
// [ '', { baz: 4 } ]
// [ 'word', { a: 1, b: 2 }, 42 ]

1 Ответ

0 голосов
/ 08 июня 2018

JSON Schema выполняет только проверку.Это не изменяет проверяемое значение.Поскольку ваш пример требует вставки значений в особых случаях, JSON Schema не может этого сделать.

Но вы можете спросить, а как насчет default?default на самом деле является ключевым словом метаданных типа title или description.Это никак не влияет на валидацию.Многие авторы библиотек включили какую-то поддержку для этого, но что бы они ни делали, это не стандартное поведение.

...