您可以使用if/then/else关键词 https://datatracker.ietf.org/doc/html/draft-handrews-json-schema-validation-01#section-6.6有条件地应用子模式。
我们只想if
and then
为您提供解决方案。
两者的值都必须是 JSON Schema。
如果值if
导致肯定的断言(当模式应用于实例并且验证成功时),则模式值then
应用于实例。
这是架构。
我已经预先加载了架构和数据https://jsonschema.dev https://jsonschema.dev/s/N4IgziBcLAOgdgAkbEASMBjAFgUwLYCGqkKI2ALhQA6QD0dAVmAPbwC0WeRAdCwE4BzOgBN+hAGYV2ABgDsdLgUIBiVABoEyVCNwSAlvH0V9bMCURwkyMoNwt8uCvwCeASTAAFFoYoWrNjao-LgAjgCu+iEiFgDaWoFBIBQu1LioCYEAuprWgajU-Cxp-Ca45lCWmYmoKWn+1YlkmGZ+lajevhl5iQC+jYj9Pb25+SB2Dk6uAIJePvBtpAE1ICERUbgxlfE9Yy0CIoaEFOXdTTkDBUUlZRVLA9og+-yH8MenlctNj3Xp7SCEfjiFxnb5DJrgmwjaqoCaOZwgz6XAEAGxRAHkJHEHlVdit9FikXimqg0CFCaRUCpRHpDMZTPAwHQ4VN3HMuiAcchocSkhQ8PAGryxmS9BYqTSDEYTGZmfZ4TN2QtQd9BjjIdlqpCeY9CsVcKV9B97j1YfLWUKSehyeKQNTdFL6bKWQiVWrrENeiB1CB9FAYDCAVR+PoAEbhE53XGq1BvRy2zwG1jwACMbp1SRdrkt31qqT+lJAnWV3pQvNQz1e7yjwA17q9vSAA这样你就可以实时测试它。
{
"$schema": "http://json-schema.org/draft-07/schema#",
"definitions": {
"geometryIsPoint": {
"required": [
"type"
],
"properties": {
"type": {
"const": "Point"
}
}
},
"geometryAsPoint": {
"required": [
"coordinates"
],
"properties": {
"coordinates": {
"type": "array"
}
}
},
"geometry": {
"allOf": [
{
"if": {
"$ref": "#/definitions/geometryIsPoint"
},
"then": {
"$ref": "#/definitions/geometryAsPoint"
}
}
]
}
},
"properties": {
"geometry": {
"$ref": "#/definitions/geometry"
}
}
}
该物业geometry
引用定义geometry
.
allOf
是一个模式数组。
的价值allOf[0].if
引用定义为的模式geometryIsPoint
.
架构定义为geometryIsPoint
被应用到geometry
价值。如果验证成功,则then
应用引用的架构。
您不必使用引用来执行任何操作,但我认为这使意图更加清晰。
根据需要扩展架构,将架构添加到allOf
适用于您想要识别的任意多种几何类型。
Edit:
你正在击中else
你的条件的条件,因为if
验证失败。让我解释。
这是一个更新的架构,用于涵盖您修改后的用例。
{
"$schema": "http://json-schema.org/draft-07/schema#",
"definitions": {
"geometry": {
"type": "object",
"required": [
"type"
],
"properties": {
"type": {
"enum": [
"Point",
"somethingelse",
null
]
}
}
},
"geometryIsPoint": {
"type": "object",
"required": [
"type"
],
"properties": {
"type": {
"const": "Point"
}
}
},
"attributes": {
"properties": {
"name": {
"type": "string"
},
"place": {
"type": "string"
}
}
},
"partialAttributes": {
"type": "object",
"required": [
"name"
]
},
"fullAttributes": {
"type": "object",
"required": [
"name",
"place"
]
},
"conditionalAttributes": {
"allOf": [
{
"if": {
"required": [
"geometry"
],
"properties": {
"geometry": {
"$ref": "#/definitions/geometryIsPoint"
}
}
},
"then": {
"required": [
"attributes"
],
"properties": {
"attributes": {
"$ref": "#/definitions/partialAttributes"
}
}
},
"else": {
"required": [
"attributes"
],
"properties": {
"attributes": {
"$ref": "#/definitions/fullAttributes"
}
}
}
}
]
}
},
"properties": {
"attributes": {
"$ref": "#/definitions/attributes"
},
"geometry": {
"$ref": "#/definitions/geometry"
}
},
"allOf": [
{
"$ref": "#/definitions/conditionalAttributes"
}
]
}
这是一个JSON 架构开发链接 https://jsonschema.dev/s/N4IgziBcLAOgdgAkbEASMBjAFgUwLYCGqkKI2ALhQA6QD0dAVmAPbwC0WeRAdCwE4BzOgBN+hAGYV2ABgDsdLgUIBiVABoEyVCNwSAlvH0V9bMCURwkyMoNwt8uCvwCeFqzZuoKL6rguoLABGjLiYFBpanmT8uACOAK76sSIWANpR0WQ+fqiZNgC6mtaeqNT8LH78JrjmUJb5pSA5-vUeWV4guPAJ+OmNHagACiyGESDFHdGorI4U2IZ2ADZgrZNTNj1LSwOeBbuIAL4DxyVH69ogdg5OrgCSYCNj7gPevq2kgSFh4xedsYlkrhUvUMmcmi08uDEEVXiBypVcNV9LUXtDLpC2gdLpgzONPiAnvBxgdTlkyTZDn9UIQqPx9EEEhRUVjoWUKlUanVSO0sqh4IRHGiNtl3gFwM5FlCplSDmUloRMB8GujOpiCWBJfBBNKOhTPPrzvkyoRkYQlgBBOkMpksnlw9VkYKhcKRNkgAFJFL9VX8wWtAYFPlnWVnVASBLbK2SxnM7kqvnNMX1L4u35wz1AkGkMFTP1CiZy+EKpW6vb5UNNXHwETGUwCy3W2N2hPTEDmpYAeQkPqmvMGIH0PdZIsume9oOxbeuc1cZY2sNVTQRnJR8f7ItQM9ubhHo6aaFiw4JKlEekMdbMdG3zhcDyJJKX0UNMqnlY23jw8GFo9Q4+Bvb7mQtIxradRTsgi77uyiLIi2G4fu2TZgT+QFkIeejiqeugGEYJhXtQpomOa0b0s24FPgaEFHG+fyJrgKzKghib-tmiC5kBNLIXG85TFBv7whySJcqhAkgWRKF7mhqAYceZDYeeeH1mAdARlG3EstRyAvnqb6koGFZRO+MGrvBxpIaBPFSZ0slYWeuGXvAKniTaVkVtSVz2LOu72u6tkpiACkOfhTnXl5O7zhSxntts3aAcgCEyUedk4ReIUqdWtYhSRGkUVR1j7PAhwTIOUAwOZLnkaJTQCgWBJDEirDfoWvogAAcp2AAqiBDAAMhaADCACi4p3G1ABqFq9XcAAiiB3AAYognUABJ3AAyog01tUN82bQASkNACynbjUNc0ANzsAAFJFHk3nO1kQsmBIdd1QydmNnUaCgrW4gItYClZPKGqcxWHEAA这样你就可以测试它。
我们在这里所做的就是分散关注点。
的“形状”attributes
and geometry
在定义中用相应的键定义。这些模式不断言这些对象中需要哪些键,仅断言如果提供了它们必须是什么。
Because $ref
在模式中忽略模式中的所有其他关键字(对于草案 7 或以下),在根级别,我将引用包装为conditionalAttributes
in an allOf
.
conditionalAttributes
是一个定义的 JSON Schema。我用过allOf
这样您就可以添加更多条件检查。
的价值conditionalAttributes.allOf[0].if
是一个 JSON 架构,并应用于 JSON 实例的根。它需要一个密钥geometry
并且该值是geometryIsPoint
。 (如果省略required
,您最终会遇到验证问题,因为省略该键将通过 if 条件)。
当实例结果为true
断言(验证有效)if
值模式,那么then
值模式应用于根级别。
因为它应用于根级别并且您想要检查嵌套属性的值,所以您必须使用properties
就像您处于架构的根级别时一样。THIS是你如何进行条件模式应用程序(if/then/else
)跨越实例的不同深度。
您可以通过将架构值之一更改为来测试条件解析false
并查看错误。记住,true
and false
是有效的 JSON 模式,因此您可以编写"then": false
如果您期望导致错误then
要应用的模式(如if
模式断言验证正常)。