问题描述
所以我正在使用Json元架构https://json-schema.org/draft/2019-09/meta/core 使用https://github.com/java-json-tools/json-schema-validator
进一步验证JSONSchema我有一个要求,我必须限制一个模式,使其不能嵌套对象,例如下面的模式应该无效
{
"$schema": "http://json-schema.org/draft-07/schema#","$id": "http://example.com/product.schema.json","title": "test","description": "A product from Acme's catalog","type": "object","properties": {
"productId": {
"description": "Outer","properties": {
"lineId": {
"description": "Outer","type": "object"
}
}
}
}
}
由于productId
是一个对象,并且它还有另一个对象lineId
,所以productId
只能有字符串或数字字段,而不能有对象,
如何扩展MetaSchema以强制执行此操作。
感谢您的帮助
解决方法
您的问题存在版本不一致的地方,但是我将假设使用草稿04,因为您使用的验证程序最多支持草稿04。如果您需要对其他草稿执行此操作,则该过程将在-07草稿中类似。草稿2019-09将会更加复杂。
- 制作04草案元模式的副本
- 删除子方案中不希望包含的任何内容,包括“对象”
type
和与对象相关的任何关键字,例如properties
。 - 将
id
更改为https://my-project.com/nested-meta-schema
之类的独特内容。 - 再制作一份草案04元模式
- 将所有递归引用(
{ "$ref": "#" }
)替换为对刚创建的架构({ "$ref": "https://my-project.com/nested-meta-schema" }
)的引用 - 将第二个架构的
id
更改为https://my-project.com/flat-meta-schema
之类的独特名称。 - 对于要根据元模式验证的任何模式,请将
$schema
更改为您提供的第二个元模式的ID。
请注意,并非所有的实现都支持自定义元方案,因此您的工作量可能会有所不同。