【问题标题】:Regex for JSON schemaJSON 模式的正则表达式
【发布时间】:2019-12-27 19:23:02
【问题描述】:

如何为 json 模式添加正则表达式验证,其中属性是动态创建的,格式为 api 模式,并且只能包含所有大写/小写字母、数字、斜杠 (/) 和花括号 {}

例如:

/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(规范 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.)

此外,如果我调整外部正则表达式以验证任何空白空间,例如:^[a-zA-Z0-9{}/\s],它不会抱怨任何空间错误:

{"/emp loye  e/v1/{empI   d}/{f  ooBar}":{"EMP":{}}} -- PASS? (Actually it shoud FAIL ???)

【问题讨论】:

  • 你有正确的方法,但你错过了如何应用子模式。今晚我会尽力为您提供解决方案=]
  • 感谢您的回复。同时,我应该如何理解您的评论“如何应用子模式”?
  • 我已更新以提供更清晰的信息。给您带来不便,敬请见谅
  • 随着您更新的问题,我的评论不再适用。

标签: json jsonschema json-schema-validator ajv


【解决方案1】:

您的架构存在两个问题。

首先,正则表达式默认情况下是不锚定的。你需要锚定它们。 您的第一个正则表达式没有完全锚定。

其次,即使它已完全锚定,您也没有禁止其他属性。

这是一个更新的架构:

{
  "$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:{"/employee/v1/{empId}":{"EMP":{}}}。另外,不确定如何解决空间验证问题。
  • 我已经修改了正则表达式以按您的预期工作。需要添加重复。
  • “处理地址空间验证”是什么意思?
  • 我提到了验证 API 密钥中的空格。但是我现在检查了一下,它似乎在修改后也得到了修复。所以简而言之,正则表达式现在正在验证:大写/小写字母、数字、斜杠 (/)、花括号 {} 和键中的无空格。谢谢它现在按预期工作。
  • 不客气。如果您有任何不适合 StackOverflow 的 JSON Schema 问题,请随时通过网站加入我们的 open slack。
猜你喜欢
  • 1970-01-01
  • 2014-10-15
  • 1970-01-01
  • 1970-01-01
  • 2021-06-09
  • 2019-06-22
  • 1970-01-01
  • 1970-01-01
  • 2017-03-25
相关资源
最近更新 更多