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
}
地址数据仍然是可选的,但如果提供,将对其进行验证。
我有一个很长的 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
}
地址数据仍然是可选的,但如果提供,将对其进行验证。