无法编写 JSON 架构来验证数组内的属性

问题描述 投票:0回答:1

我正在尝试编写 JSON 模式来验证包含以下内容的 JSON 文件:

{
    "number" : "1",
    "rootProperty":
    [
       {  
            "property1":"value1"
       },
       {  
            "property2":"value2"
       }
    ]
}

该架构应处理以下场景:

  1. 如果 property2 存在而 property1 缺失,则应报告错误,指出 property1 缺失,因为它是强制性的。
  2. 如果 property1 存在而 property2 缺失,则应报告错误,指出 property2 缺失,因为它是强制性的。
  3. 如果 property1 和 property2 都存在,则不应报告错误。
  4. 如果先提到property2,再提到property1,应该不会报错。
  5. 如果提到property1和property2以外的属性,应该报错(additionalProperties:false?)
  6. property1 和 property2 不应重复(uniqueItems:true?)

有人可以帮忙吗?

此外,模式是否是处理这种深度验证的正确方法?

当我尝试对 rootProperty 数组使用“items”关键字并在所需条件内提到 property1 和 property2 时,会对数组的每个元素评估这些条件,这会导致错误,指出第一个元素中缺少 property2,第二个元素中缺少 property1元素。 此外,使用“包含”会导致错误,指出对象包含无法针对任何属性或附加属性进行评估的属性。

javascript json schema jsonschema json-schema-validator
1个回答
0
投票

这就是我要做的工作:

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "number": { "type": "string" },
    "rootProperty": {
      "type": "array",
      "items": {
        "type": "object",
        "oneOf": [
          { "required": ["property1"] },
          { "required": ["property2"] }
        ]
      },
      "allOf": [
        {
          "contains": { "required": ["property1"] },
          "maxContains": 1
        },
        {
          "contains": { "required": ["property2"] },
          "maxContains": 1
        }
      ] 
    }
  },
  "required": ["number", "rootProperty"]
}

这适用于多个部分:

  • rootProperty
    被定义为一个数组,其中所有项目必须具有
    property1
    property2
    ,但不能同时具有两者(通过
    oneOf
    required
    子模式定义)。
  • 稍后,在数组上定义,我们包含一个
    allOf
    contains
    子模式。 这意味着所有子模式都必须通过,并且每个子模式表示数组必须包含具有特定属性的对象。
    maxContains
    确保数组中只有一个对象包含该属性。

但是有一个问题:

maxContains
直到 2019-09 才定义,因此您需要使用它或 2020-12 来完成这项工作。 (您在对托尼的评论中提到了草案 7。恐怕您无法使用草案 7 来完成这项工作。)

请随意使用我的在线验证器进行测试:https://json-everything.net/json-schema

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.