JSON模式条件验证草案7

时间:2020-09-22 16:35:18

标签: json jsonschema json-schema-validator

我有一个很长的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字段,使其不需要地址,并确保在地址模式中存在必填字段。如果我不添加地址,它将进行验证,但是如果我在数组中放入一个地址并为该地址保留一个必填字段,则该地址仍会验证。如果存在,我如何验证地址?

1 个答案:

答案 0 :(得分:0)

我不确定我是否了解地址项目规范中$ time zstd --long enwik82 -f -o enwik82.long.zst enwik82 : 17.82% (200000000 => 35644486 bytes, enwik82.long.zst) real 0m0.911s user 0m0.898s sys 0m0.130s $ time zstd enwik82 -f -o enwik82.zst enwik82 : 35.63% (200000000 => 71251491 bytes, enwik82.zst) real 0m1.208s user 0m1.207s sys 0m0.162s 的目的。如果您这样简化:

anyOf

地址数据仍然是可选的,但如果提供,它将被验证。