Enums JSON模式枚举是否可以不区分大小写? JSON模式枚举

Enums JSON模式枚举是否可以不区分大小写? JSON模式枚举,enums,case-insensitive,jsonschema,Enums,Case Insensitive,Jsonschema,: 此架构验证值,如[1600,“宾夕法尼亚”,“大道”,“西北”] 问题 是否有一种优雅的方法可以使enum不区分大小写,以便Avenue和Avenue都被接受为数组中的第三个值 其他可能的解决办法 我可以在值列表中使用anyOf,并根据不区分大小写的正则表达式对每个值进行验证-但这很麻烦,容易出错,而且不雅观。恐怕您找不到任何优雅的解决方案。有一项建议 因此,如果你不能避免这个要求,正则表达式解决方案是唯一可行的。另一种蛮力方法是拥有n个完整的枚举值列表,一个以大写字母开头,另一个以大写字母

:

此架构验证值,如
[1600,“宾夕法尼亚”,“大道”,“西北”]

问题 是否有一种优雅的方法可以使
enum
不区分大小写,以便
Avenue
Avenue
都被接受为数组中的第三个值

其他可能的解决办法
我可以在值列表中使用
anyOf
,并根据不区分大小写的正则表达式对每个值进行验证-但这很麻烦,容易出错,而且不雅观。

恐怕您找不到任何优雅的解决方案。有一项建议

因此,如果你不能避免这个要求,正则表达式解决方案是唯一可行的。另一种蛮力方法是拥有n个完整的枚举值列表,一个以大写字母开头,另一个以大写字母开头,等等,然后使用您所说的任意一个。您可以轻松地自动创建此json模式。显然,它的可读性不强


无论如何,我会尝试在验证之前通过预处理步骤来解决这个问题。您可以将所需的属性(如果存在)转换为小写,然后进行验证。我发现有点被迫使用json模式规范来允许“脏”数据。

我最终创建了两个帮助程序,将字符串转换为不区分大小写的模式,并将其转换回小写版本:

const toCaseInsensitive = (v = "") =>
    v
        .split("")
        .map(l => {
            const lower = l.toLowerCase()
            const upper = l.toUpperCase()
            return lower === upper ? lower : `[${lower}|${upper}]`
        })
        .join("")
用法:

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

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"