JSON模式的if-else条件复杂的情况(JSON Schema if-else conditio

2019-10-31 09:16发布

    {
        "policyHolder": {
            "fullName": "A"
        },
        "traveller": [
            {
                "fullName": "B",
                "relationship": "Spouse"
            },
            {
                "fullName": "A",
                "relationship": "My Self"
            }
        ]
    }

在上面的JSON,我想验证

  • if "relationship" = "My Self"fullName必须匹配fullNamepolicyHolder
  • 字段relationship必须存在traveller阵列,否则JSON是无效

我试图创建一个JSON模式if-elseallOf等,但没有什么工作可以做这些验证,但不能。 请帮忙!!

架构:

{
    "type": "object",
    "required": [
        "policyHolder",
        "traveller",
    ],
    "properties": {
        "policyHolder": {
            "$id": "#/properties/policyHolder",
            "type": "object",
            "required": [
                "fullName"
            ],
            "properties": {
                "fullName": {
                    "$id": "#/properties/policyHolder/properties/fullName",
                    "type": "string",
                }
            }
        },
        "traveller": {
            "$id": "#/properties/traveller",
            "type": "array",
            "minItems": 1,
            "items": {
                "$id": "#/properties/traveller/items",
                "type": "object",
                "properties": {
                    "fullName": {
                        "$ref": "#/properties/policyHolder/properties/fullName"
                    },
                    "relationship": {
                        "$id": "#/properties/traveller/items/properties/relationship",
                        "type": "string",
                    }
                },
                "required": [
                    "fullName",
                    "relationship"
                ],
                }
            }
        }
    }```

Answer 1:

它是你要拥有最麻烦您的第一要求。 JSON模式不支持数据的验证对数据的情况下的其他地方。 这是一个高度讨论的话题 ,但目前尚无采用。 我建议你用很少的代码验证这一点。

对于第二个,我建议你抽取你的一些子模式的进入定义,而不是试图用ID来渣土约。 ID通常更有益,如果你从其他文件中引用它们,或者如果你使用短(如单字)的ID。 定义ID作为其在文档中的位置是多余的; 大多数处理器会自动处理。

{
  "type": "object",
  "required": [
    "policyHolder",
    "traveller",
  ],
  "definitions": {
    "person": {
      "type": "object"
      "properties": {
        "fullName": {"type": "string"}
      },
      "required": ["fullName"]
    },
    "relationship": { "enum": [ ... ] }   // list possible relationships
  },
  "properties": {
    "policyHolder": { "$ref": "#/definitions/person" },
    "traveller": {
      "type": "array",
      "minItems": 1,
      "items": {
        "allOf": [
          { "$ref": "#/definitions/person" },
          {
            "properties": {
              "relationship": { "$ref": "#/definitions/relationship" }
            },
            "required": ["relationship"]
          }
        ]
      }
    }
  }
}

(我提取的relationship到自己的枚举定义,但这的确是可选的。你可以把它内联,甚至是无限制的字符串,如果你没有定义的一组关系。)



Answer 2:

这不能与当前JSON模式来完成。 所有的JSON模式关键字只能在一个时间上的一个值进行操作。 还有用于添加提案$data的关键字,这将使做这种验证,但我不认为这是有可能被采纳。 $data将工作像$ref除了它引用了JSON被验证,而不是引用的模式。

这里是你将如何与解决您的问题$data

{
  "type": "object",
  "properties": {
    "policyHolder": {
      "type": "object",
      "properties": {
        "fullName": { "type": "string" }
      }
    },
    "traveler": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "fullName": { "type": "string" },
          "relationship": { "type": "string" }
        },
        "if": {
          "properties": {
            "relationship": { "const": "My Self" }
          }
        },
        "then": {
          "properties": {
            "fullName": { "const": { "$data": "#/policyHolder/fullName" } }
          }
        }
      }
    }
  }
}

如果没有$data ,你必须做到这一点的验证代码或者改变你的数据结构,所以它是没有必要的。



文章来源: JSON Schema if-else condition complex scenario