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