JSON 架构条件验证草案 7

JSON Schema conditional Validation Draft 7

我有一个很长的 JSON 文档需要根据架构进行验证。我有 JSON 的某些子部分,只需要在存在数据时进行验证。这是我的 JSON 的一个子部分,我试图仅在该子部分中存在所需数据时才进行验证:

{
      "Entity":{
        "Base":{
          "Key":"",
          "SubmittedDate":"1/1/1900",
          "Address":[
              {
                "Key":"",
                "Type": ["Physical", "Mailing", "Primary", "Secondary"],
                "LineOne":"123 here st",
                "LineTwo": "",
                "CountyOrigin":"",
                "CityTown": "Anytown",
                "StateProvidence": "CA",
                "Country": "US",
                "PostalCode": "33333"
              }
            ]
        }
      }
    }

“地址”节点是有条件的。如果数组中有地址,我需要验证地址中是否存在所需字段。它们的地址可能不存在,因为“基本”节点不需要它。这是我开始使用的 JSON 架构:

  {
    "$schema": "http://json-schema.org/draft-07/schema",
    "$id": "http://example.com/example.json",
    "type": "object",
    "title": "The root schema",
    "description": "The root schema comprises the entire JSON document.",
    "default": {},
    "required": [
        "Entity"
    ],
    "properties": {
        "Entity": {
            "$id": "#/properties/Entity",
            "type": "object",
            "title": "The Entity schema",
            "description": "An explanation about the purpose of this instance.",
            "default": {},
            "required": [
                "Base"
            ],
            "properties": {
                "Base": {
                    "$id": "#/properties/Entity/properties/Base",
                    "type": "object",
                    "title": "The Base schema",
                    "description": "An explanation about the purpose of this instance.",
                    "default": {},
                    "required": [
                        "Key",
                        "SubmittedDate"
                    ],
                    "properties": {
                        "Key": {
                            "$id": "#/properties/Entity/properties/Base/properties/Key",
                            "type": "string",
                            "title": "The Key schema",
                            "description": "An explanation about the purpose of this instance.",
                            "default": ""
                        },
                        "SubmittedDate": {
                            "$id": "#/properties/Entity/properties/Base/properties/SubmittedDate",
                            "type": "string",
                            "title": "The SubmittedDate schema",
                            "description": "An explanation about the purpose of this instance.",
                            "default": ""
                        },
                        "Address": {
                            "$id": "#/properties/Entity/properties/Base/properties/Address",
                            "type": "array",
                            "title": "The Address schema",
                            "description": "An explanation about the purpose of this instance.",
                            "default": [],
                            "additionalItems": true,
                            "items": {
                                "$id": "#/properties/Entity/properties/Base/properties/Address/items",
                                "anyOf": [
                                    {
                                        "$id": "#/properties/Entity/properties/Base/properties/Address/items/anyOf/0",
                                        "type": "object",
                                        "title": "The first anyOf schema",
                                        "description": "An explanation about the purpose of this instance.",
                                        "default": {},
                                        "required": [
                                            "Type",
                                            "LineOne",
                                            "CountyOrigin",
                                            "CityTown",
                                            "StateProvidence",
                                            "Country",
                                            "PostalCode"
                                        ],
                                        "properties": {
                                            "Key": {
                                                "$id": "#/properties/Entity/properties/Base/properties/Address/items/anyOf/0/properties/Key",
                                                "type": "string",
                                                "title": "The Key schema",
                                                "description": "An explanation about the purpose of this instance.",
                                                "default": ""
                                            },
                                            "Type": {
                                                "$id": "#/properties/Entity/properties/Base/properties/Address/items/anyOf/0/properties/Type",
                                                "type": "array",
                                                "title": "The Type schema",
                                                "description": "An explanation about the purpose of this instance.",
                                                "default": [],
                                                "additionalItems": true,
                                                "items": {
                                                    "$id": "#/properties/Entity/properties/Base/properties/Address/items/anyOf/0/properties/Type/items",
                                                    "anyOf": [
                                                        {
                                                            "$id": "#/properties/Entity/properties/Base/properties/Address/items/anyOf/0/properties/Type/items/anyOf/0",
                                                            "type": "string",
                                                            "title": "The first anyOf schema",
                                                            "description": "An explanation about the purpose of this instance.",
                                                            "default": ""
                                                        }
                                                    ]
                                                }
                                            },
                                            "LineOne": {
                                                "$id": "#/properties/Entity/properties/Base/properties/Address/items/anyOf/0/properties/LineOne",
                                                "type": "string",
                                                "title": "The LineOne schema",
                                                "description": "An explanation about the purpose of this instance.",
                                                "default": ""
                                            },
                                            "LineTwo": {
                                                "$id": "#/properties/Entity/properties/Base/properties/Address/items/anyOf/0/properties/LineTwo",
                                                "type": "string",
                                                "title": "The LineTwo schema",
                                                "description": "An explanation about the purpose of this instance.",
                                                "default": ""
                                            },
                                            "CountyOrigin": {
                                                "$id": "#/properties/Entity/properties/Base/properties/Address/items/anyOf/0/properties/CountyOrigin",
                                                "type": "string",
                                                "title": "The CountyOrigin schema",
                                                "description": "An explanation about the purpose of this instance.",
                                                "default": ""
                                            },
                                            "CityTown": {
                                                "$id": "#/properties/Entity/properties/Base/properties/Address/items/anyOf/0/properties/CityTown",
                                                "type": "string",
                                                "title": "The CityTown schema",
                                                "description": "An explanation about the purpose of this instance.",
                                                "default": ""
                                            },
                                            "StateProvidence": {
                                                "$id": "#/properties/Entity/properties/Base/properties/Address/items/anyOf/0/properties/StateProvidence",
                                                "type": "string",
                                                "title": "The StateProvidence schema",
                                                "description": "An explanation about the purpose of this instance.",
                                                "default": ""
                                            },
                                            "Country": {
                                                "$id": "#/properties/Entity/properties/Base/properties/Address/items/anyOf/0/properties/Country",
                                                "type": "string",
                                                "title": "The Country schema",
                                                "description": "An explanation about the purpose of this instance.",
                                                "default": ""
                                            },
                                            "PostalCode": {
                                                "$id": "#/properties/Entity/properties/Base/properties/Address/items/anyOf/0/properties/PostalCode",
                                                "type": "string",
                                                "title": "The PostalCode schema",
                                                "description": "An explanation about the purpose of this instance.",
                                                "default": ""
                                            }
                                        },
                                        "additionalProperties": true
                                    }
                                ]
                            }
                        }
                    },
                    "additionalProperties": true
                }
            },
            "additionalProperties": true
        }
    },
    "additionalProperties": true

}

如果数组中存在地址,我只想验证地址部分。我修改了架构中的 require 字段以不需要地址,并确保在地址架构中有必填字段。如果我不添加和地址它将验证,但如果我将地址放入数组并省略地址的必填字段,它仍然有效。如果存在地址,我该如何验证?

我不确定我是否理解地址项规范中 anyOf 的用途。如果你这样简化它:

{
  "$schema": "http://json-schema.org/draft-07/schema",
  "$id": "http://example.com/example.json",
  "type": "object",
  "title": "The root schema",
  "description": "The root schema comprises the entire JSON document.",
  "default": {
    
  },
  "required": [
    "Entity"
  ],
  "properties": {
    "Entity": {
      "$id": "#/properties/Entity",
      "type": "object",
      "title": "The Entity schema",
      "description": "An explanation about the purpose of this instance.",
      "default": {
        
      },
      "required": [
        "Base"
      ],
      "properties": {
        "Base": {
          "$id": "#/properties/Entity/properties/Base",
          "type": "object",
          "title": "The Base schema",
          "description": "An explanation about the purpose of this instance.",
          "default": {
            
          },
          "required": [
            "Key",
            "SubmittedDate"
          ],
          "properties": {
            "Key": {
              "$id": "#/properties/Entity/properties/Base/properties/Key",
              "type": "string",
              "title": "The Key schema",
              "description": "An explanation about the purpose of this instance.",
              "default": ""
            },
            "SubmittedDate": {
              "$id": "#/properties/Entity/properties/Base/properties/SubmittedDate",
              "type": "string",
              "title": "The SubmittedDate schema",
              "description": "An explanation about the purpose of this instance.",
              "default": ""
            },
            "Address": {
              "$id": "#/properties/Entity/properties/Base/properties/Address",
              "type": "array",
              "title": "The Address schema",
              "description": "An explanation about the purpose of this instance.",
              "default": [
                
              ],
              "additionalItems": true,
              "items": {
                "$id": "#/properties/Entity/properties/Base/properties/Address/items",
                "type": "object",
                "title": "Address item schema",
                "description": "An explanation about the purpose of this instance.",
                "default": {
                  
                },
                "required": [
                  "Type",
                  "LineOne",
                  "CountyOrigin",
                  "CityTown",
                  "StateProvidence",
                  "Country",
                  "PostalCode"
                ],
                "properties": {
                  "Key": {
                    "$id": "#/properties/Entity/properties/Base/properties/Address/items/anyOf/0/properties/Key",
                    "type": "string",
                    "title": "The Key schema",
                    "description": "An explanation about the purpose of this instance.",
                    "default": ""
                  },
                  "Type": {
                    "$id": "#/properties/Entity/properties/Base/properties/Address/items/anyOf/0/properties/Type",
                    "type": "array",
                    "title": "The Type schema",
                    "description": "An explanation about the purpose of this instance.",
                    "default": [
                      
                    ],
                    "additionalItems": true,
                    "items": {
                      "$id": "#/properties/Entity/properties/Base/properties/Address/items/anyOf/0/properties/Type/items",
                      "anyOf": [
                        {
                          "$id": "#/properties/Entity/properties/Base/properties/Address/items/anyOf/0/properties/Type/items/anyOf/0",
                          "type": "string",
                          "title": "The first anyOf schema",
                          "description": "An explanation about the purpose of this instance.",
                          "default": ""
                        }
                      ]
                    }
                  },
                  "LineOne": {
                    "$id": "#/properties/Entity/properties/Base/properties/Address/items/anyOf/0/properties/LineOne",
                    "type": "string",
                    "title": "The LineOne schema",
                    "description": "An explanation about the purpose of this instance.",
                    "default": ""
                  },
                  "LineTwo": {
                    "$id": "#/properties/Entity/properties/Base/properties/Address/items/anyOf/0/properties/LineTwo",
                    "type": "string",
                    "title": "The LineTwo schema",
                    "description": "An explanation about the purpose of this instance.",
                    "default": ""
                  },
                  "CountyOrigin": {
                    "$id": "#/properties/Entity/properties/Base/properties/Address/items/anyOf/0/properties/CountyOrigin",
                    "type": "string",
                    "title": "The CountyOrigin schema",
                    "description": "An explanation about the purpose of this instance.",
                    "default": ""
                  },
                  "CityTown": {
                    "$id": "#/properties/Entity/properties/Base/properties/Address/items/anyOf/0/properties/CityTown",
                    "type": "string",
                    "title": "The CityTown schema",
                    "description": "An explanation about the purpose of this instance.",
                    "default": ""
                  },
                  "StateProvidence": {
                    "$id": "#/properties/Entity/properties/Base/properties/Address/items/anyOf/0/properties/StateProvidence",
                    "type": "string",
                    "title": "The StateProvidence schema",
                    "description": "An explanation about the purpose of this instance.",
                    "default": ""
                  },
                  "Country": {
                    "$id": "#/properties/Entity/properties/Base/properties/Address/items/anyOf/0/properties/Country",
                    "type": "string",
                    "title": "The Country schema",
                    "description": "An explanation about the purpose of this instance.",
                    "default": ""
                  },
                  "PostalCode": {
                    "$id": "#/properties/Entity/properties/Base/properties/Address/items/anyOf/0/properties/PostalCode",
                    "type": "string",
                    "title": "The PostalCode schema",
                    "description": "An explanation about the purpose of this instance.",
                    "default": ""
                  }
                },
                "additionalProperties": true
              }
            }
          },
          "additionalProperties": true
        }
      },
      "additionalProperties": true
    }
  },
  "additionalProperties": true
}

地址数据仍然是可选的,但如果提供,将对其进行验证。