JSON 模式的正则表达式
Regex for JSON schema
如何为 json 模式添加正则表达式验证,其中属性是动态创建的,格式为 api 模式,并且只能包含所有 upper/lower 字母表,数字、斜杠 (/) 和花括号 {}
例如:
/someapi/v1/{用户名}
/someApi/v1/{用户名}
这是我的 Uschema:
{
"type": "object",
"patternProperties": {
"^[a-zA-Z0-9{}/]": {
"additionalProperties": false,
"type": "object",
"patternProperties": {
"^(EMP|MGR|ACCT)$": {
"additionalProperties": false,
"type": "object"
}
}
}
}
}
这里是 JSON 和使用 ajv (spec 7)
的结果
我的JSON样本:
{"/employee/v1/{empId}":{"EMP":{}}} - PASS
{"/employee/v1/{empId}":{"E1MP":{}}} - FAIL (I can understand as E1MP is there)
{"/employee/v1/{empId}/<fooBar>":{"E1MP":{}}} - FAIL
(I can understand as E1MP is there but didn't complain about < >
brackets as it was the first entry to validate)
{"/employee/v1/{empId}/<fooBar>":{"EMP":{}}} - PASS (?)
(Actually it should FAIL ???, Why it is considering the < > brackets though I have the regex in place for the outer parent property.)
此外,如果我调整外部正则表达式来验证任何空的 space,例如:^[a-zA-Z0-9{}/\s],它不会抱怨 [=37] 的任何错误=]s:
{"/emp loye e/v1/{empI d}/{f ooBar}":{"EMP":{}}} -- PASS? (Actually it shoud FAIL ???)
您的架构有两个问题。
首先,默认情况下不锚定正则表达式。你需要锚定它们。
您的第一个正则表达式未完全锚定。
其次,即使它已完全锚定,您也没有禁止其他属性。
这是更新后的架构:
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"additionalProperties": false,
"patternProperties": {
"^[a-zA-Z0-9{}/]+$": {
"additionalProperties": false,
"type": "object",
"patternProperties": {
"^(EMP|MGR|ACCT)$": {
"additionalProperties": false,
"type": "object"
}
}
}
}
}
现在,任何 属性 与正则表达式不匹配的对象都将如您所料导致验证错误。
如何为 json 模式添加正则表达式验证,其中属性是动态创建的,格式为 api 模式,并且只能包含所有 upper/lower 字母表,数字、斜杠 (/) 和花括号 {}
例如:
/someapi/v1/{用户名}
/someApi/v1/{用户名}
这是我的 Uschema:
{
"type": "object",
"patternProperties": {
"^[a-zA-Z0-9{}/]": {
"additionalProperties": false,
"type": "object",
"patternProperties": {
"^(EMP|MGR|ACCT)$": {
"additionalProperties": false,
"type": "object"
}
}
}
}
}
这里是 JSON 和使用 ajv (spec 7)
的结果我的JSON样本:
{"/employee/v1/{empId}":{"EMP":{}}} - PASS
{"/employee/v1/{empId}":{"E1MP":{}}} - FAIL (I can understand as E1MP is there)
{"/employee/v1/{empId}/<fooBar>":{"E1MP":{}}} - FAIL
(I can understand as E1MP is there but didn't complain about < >
brackets as it was the first entry to validate)
{"/employee/v1/{empId}/<fooBar>":{"EMP":{}}} - PASS (?)
(Actually it should FAIL ???, Why it is considering the < > brackets though I have the regex in place for the outer parent property.)
此外,如果我调整外部正则表达式来验证任何空的 space,例如:^[a-zA-Z0-9{}/\s],它不会抱怨 [=37] 的任何错误=]s:
{"/emp loye e/v1/{empI d}/{f ooBar}":{"EMP":{}}} -- PASS? (Actually it shoud FAIL ???)
您的架构有两个问题。
首先,默认情况下不锚定正则表达式。你需要锚定它们。 您的第一个正则表达式未完全锚定。
其次,即使它已完全锚定,您也没有禁止其他属性。
这是更新后的架构:
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"additionalProperties": false,
"patternProperties": {
"^[a-zA-Z0-9{}/]+$": {
"additionalProperties": false,
"type": "object",
"patternProperties": {
"^(EMP|MGR|ACCT)$": {
"additionalProperties": false,
"type": "object"
}
}
}
}
}
现在,任何 属性 与正则表达式不匹配的对象都将如您所料导致验证错误。