【问题标题】:JSON Schema object properties defined by enum枚举定义的 JSON Schema 对象属性
【发布时间】:2022-12-17 08:00:37
【问题描述】:

我试图在我的 JSON 架构中重用枚举来定义对象的属性。

我想知道以下是否正确。

JSON模式

{
  "type": "object",
  "propertyNames": {
    "enum": ["Foo","Bar"]
  },
  "patternProperties": {
    ".*": {
      "type": "number"
    }
  }
}

JSON数据

{
    "Foo": 123,
    "Bar": 456
}

我问的原因是我从 JSON 模式验证库中得到不一致的结果。一些表示 JSON 有效,而另一些表示 JSON 无效。

附:如果有人想知道“为什么”我试图用枚举定义属性,那是因为枚举在我的 json 模式的各个部分共享。在某些情况下,它是对字符串的约束,但我需要在这些字符串属性和对象属性上使用相同的一组可能值。作为枚举,我可以在一个地方维护一组可能的值。

【问题讨论】:

  • 文档说propertyNames 中允许任何模式,type 隐式设置为string。所以我认为你的方法是正确的。你能分享哪些验证器失败了吗? propertyNames 仅随草案 6 一起提供,所以也许您的一些验证者还不支持它?
  • Ajv 因上面的确切模式而失败。但奇怪的是,一个使用类似模式的更复杂的模式,唯一的区别是枚举是一个 $ref。我试过的几个在线 JSON Schema 验证器也失败了。
  • 我快速完成了一个示例 $ref: jsonschemavalidator.net example ,它按预期工作。您能否将带有 $ref 的失败示例添加到您的问题中>
  • 您的 JSON 模式有效且正确。 “失败”是什么意思?我想知道“严格模式”是否在这里引起了问题。
  • Ajv 确实有效,我用错了 API。我将不得不找到失败的特定验证器并分享它们。

标签: json jsonschema


【解决方案1】:

是的,这是一个有效的 JSON 架构。你也可以这样表达:

{
  "type": "object",
  "propertyNames": {
    "enum": ["Foo","Bar"]
  },
  "additionalProperties": {
    "type": "number"
  }
}

它说“所有属性名称都必须符合此架构:(枚举中列出的这些值之一);此外,所有属性值都必须符合此架构:(必须是数字类型)。”

您从将此报告为无效的实现中得到什么错误?这些实现有一个错误;你会考虑向他们报告吗?

【讨论】:

    猜你喜欢
    • 2020-10-07
    • 2022-01-23
    • 2020-07-19
    • 2018-04-18
    • 1970-01-01
    • 2017-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多