Могут ли перечисления схем JSON быть нечувствительными к регистру?

Перечисления схемы JSON

Перечисления функций схем JSON, которые налагают ограничение на значения строкового типа:

{
    "type": "array",
    "items": [
        {
            "type": "number"
        },
        {
            "type": "string"
        },
        {
            "type": "string",
            "enum": ["Street", "Avenue", "Boulevard"]
        },
        {
            "type": "string",
            "enum": ["NW", "NE", "SW", "SE"]
        }
    ]
}

Эта схема проверяет такие значения, как [1600, "Pennsylvania", "Avenue", "NW"].

Эта проблема

Есть ли элегантный способ сделать enum нечувствительным к регистру, чтобы и Avenue, и avenue принимались как третье значение в массиве?

Другие возможные решения

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


person Adam Matan    schedule 28.10.2014    source источник


Ответы (3)


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

Поэтому, если вы не можете избежать этого требования, решения с использованием регулярных выражений являются единственно возможными. Другой подход грубой силы заключался бы в том, чтобы иметь n полных списков значений перечисления, один с начальными заглавными буквами, другой - все заглавные буквы и т.д., а затем использовать anyOf, как вы указали. Вы можете легко автоматизировать создание этой json-схемы. Очевидно, это будет не очень удобно.

В любом случае я бы попытался решить это с помощью этапа предварительной обработки перед проверкой. Вы можете преобразовать требуемые свойства в нижний регистр, если они есть, а затем проверить их. Я считаю, что немного вынужден использовать спецификацию json-схемы, чтобы разрешить «грязные» данные.

person jruizaranguren    schedule 28.10.2014

В итоге я создал 2 помощника для преобразования строки в шаблоны без учета регистра и преобразования их обратно в их версию в нижнем регистре:

const toCaseInsensitive = (v = "") =>
    v
        .split("")
        .map(l => {
            const lower = l.toLowerCase()
            const upper = l.toUpperCase()
            return lower === upper ? lower : `[${lower}|${upper}]`
        })
        .join("")
const fromCaseInsensitive = (v = "") => v.replace(/\[(.)\|(.)\]/g, "$1")

Использование:

toCaseInsensitive("TeSt") -> "[t|T][e|E][s|S][t|T]"
fromCaseInsensitive("[t|T][e|E][s|S][t|T]") -> "test"

person Lino Rabolini    schedule 15.03.2019

transform, представленный в Ajv-Keywords можно использовать для перечислений без учета регистра.

AjvKeywords(ajv, 'transform');

{
    "type": "array",
    "items": [
        {
            "type": "string",
            "enum": ["NW", "NE", "SW", "SE"],
            "transform": ["toLowerCase"],
        }
    ]
}
person Rishab Jain    schedule 13.07.2021