【问题标题】:How to make a "patternProperty" required in JSON Schema (Ruby)如何制作 JSON Schema (Ruby) 中所需的“patternProperty”
【发布时间】:2015-06-11 00:19:53
【问题描述】:

考虑以下 JSON:

 {
      "1234abcd" : {
                     "model" : "civic"
                      "made" : "toyota"
                      "year" : "2014"
                     }

 }

考虑另一个 JSON:

 {
      "efgh56789" : {
                     "model" : "civic"
                      "made" : "toyota"
                      "year" : "2014"
                     }

 }

如果键是固定的,最外面的字母数字键会有所不同并且需要;假设“标识符”,那么模式很简单,但是由于键名是可变的,我们必须使用patternProperties,我怎样才能想出一个模式来捕获最外层键的这些要求:

  1. 属性名称(键)是可变的
  2. 需要
  3. 字母数字小写

在 ruby​​ 中使用 json-schema:https://github.com/ruby-json-schema/json-schema

【问题讨论】:

  • 你在问什么?
  • 我在问如何想出一个实施该结构的架构?

标签: json ruby validation jsonschema


【解决方案1】:

当这些属性是可变的时,最好的方法是使用minPropertiesmaxProperties。如果您想说您的对象中必须有一个且只有一个这些字母数字键,您可以使用以下模式。如果你想说必须至少有一个,你可以省略maxProperties

{
  "type": "object",
  "patternProperties": {
    "^[a-z0-9]+$": {
      "type": "object",
      "properties": {
        "model": { "type": "string" },
        "make": { "type": "string" },
        "year": { "type": "string" }
      },
      "required": ["model", "make", "year"]
    }
  },
  "additionalProperties": false,
  "maxProperties": 1,
  "minProperties": 1
}

【讨论】:

  • 由于某种原因 "required": ["model", "make", "year"] 在嵌套级别中不适合我。
【解决方案2】:

您可能需要更改正则表达式以适合您的有效键:

{
"patternProperties": {
    "^[a-zA-Z0-9]*$":{
        "properties": {
              "model":{"type":"string"},
              "made":{"type":"string"},
              "year":{"type":"string"}
         }
    }
},
"additionalProperties":false
}

【讨论】:

  • 正则表达式应该是这样的:"^[a-z0-9]*$",因为我们只对小写键感兴趣。但这会使其在架构 v4 中成为必需的吗?
  • 提供的模式强制顶层中每个新定义的属性的键必须满足正则表达式。在这种情况下,我不明白您所说的 required 是什么意思。
  • 我简化了案例,但是如果我在顶层有更多的属性是固定的并且不需要正则表达式匹配,我怎么能确保只需要模式属性(它必须是那里)而不是其他人。无论如何,这对我来说很好,谢谢。
  • 您可以只使用常规明确定义的键。必需的必须是具有显式字符串键的数组。您不能要求在设计时未知的键(模式属性可能从零到无限键值)。无论如何,您必须删除 additionalProperties:false
  • 正则表达式允许空字符串作为键。还有 s/toyota/honda/ 或 /civic/corolla/ :)
猜你喜欢
  • 2012-07-28
  • 2013-07-29
  • 2015-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-11
相关资源
最近更新 更多