如何在 json-schema 中扩展具有 1 个参数的对象
How to extent an object with 1 parameter in json-schema
我以前写过一个 JSON 模式,但现在,当我试图让它更高级一点时,我被卡住了。
(我对评论中的'good practice'提示持开放态度)
($id
是可选的吗?为了简单起见,我应该在示例代码中删除它吗?)
目标:
我正在尝试使用递归使用的对象定义 (example_obj
) 创建一个模式。此对象只能有 1 个参数(or
或 and
或 value
)。但是在 json 的根目录中,我想添加 1 个额外的 属性.
json-模式
{
"definitions": {
"example_obj": {
"$id": "#/definitions/example_obj",
"type": "object",
"maxProperties": 1,
"properties": {
"or": {
"$id": "#/definitions/example_obj/properties/or",
"type": "array",
"items": {
"$id": "#/definitions/example_obj/properties/or/items",
"$ref": "#/definitions/example_obj"
}
},
"and": {
"$id": "#/definitions/example_obj/properties/and",
"type": "array",
"items": {
"$id": "#/definitions/example_obj/properties/and/items",
"$ref": "#/definitions/example_obj"
}
},
"value": {
"$id": "#/definitions/example_obj/properties/value",
"type": "string"
}
}
}
},
"type": "object",
"title": "The Root Schema",
"required": ["filter_version"],
"allOf": [
{
"$ref": "#/definitions/example_obj"
},
{
"properties": {
"filter_version": {
"$id": "#/properties/filter_version",
"type": "string",
"pattern": "^([0-9]+\.[0-9]+)$"
}
}
}
]
}
json 我要通过验证:
{
"filter_version": "1.0",
"or": [
{
"and": [
{
"value": "subject"
}
]
},
{
"or": [
{
"value": "another subject"
}
]
}
]
}
问题:
当我尝试为根定义扩展 example_obj
时,它似乎失败了,因为 example_obj
对象在设计上不允许超过 1 属性。
换句话说,似乎每次检查我添加到 example_obj
的参数数量也会对附加的 属性(即 filter_version
)执行。
有谁知道在哪里检查 'exactly 1 argument' 以便不在 root
对象上进行评估?
尝试次数:
我尝试使用不同的方法来确定 example_obj
的要求,但没有成功。就像将 "maxProperties": 1
替换为:
"oneOf": [
{
"required": [
"or"
]
},
{
"required": [
"and"
]
},
{
"required": [
"where"
]
},
{
"required": [
"where not"
]
}
],
在此先感谢您的帮助!!
正在使用 online schema validator 检查我的模式。
(最后我需要在 Python 中验证它,以防万一)
您可以使用 oneOf
而不是 maxProperties
来解决这个问题。
{
"type": "object",
"properties": {
"filter_version": {
"type": "string",
"pattern": "^([0-9]+\.[0-9]+)$"
}
},
"required": ["filter_version"],
"allOf": [{ "$ref": "#/definitions/example_obj" }],
"definitions": {
"example_obj": {
"type": "object",
"properties": {
"or": { "$ref": "#/definitions/example-obj-array" },
"and": { "$ref": "#/definitions/example-obj-array" },
"value": { "type": "string" }
},
"oneOf": [
{ "required": ["or"] },
{ "required": ["and"] },
{ "required": ["value"] }
]
},
"example-obj-array": {
"type": "array",
"items": { "$ref": "#/definitions/example_obj" }
}
}
}
P.S。您使用的 $id
有误。我知道有一个工具可以生成这样的模式并导致这种混乱。这里使用 $id
的方式是空操作。它没有坏处,但除了使您的架构膨胀之外没有任何作用。
我以前写过一个 JSON 模式,但现在,当我试图让它更高级一点时,我被卡住了。
(我对评论中的'good practice'提示持开放态度)
($id
是可选的吗?为了简单起见,我应该在示例代码中删除它吗?)
目标:
我正在尝试使用递归使用的对象定义 (example_obj
) 创建一个模式。此对象只能有 1 个参数(or
或 and
或 value
)。但是在 json 的根目录中,我想添加 1 个额外的 属性.
json-模式
{
"definitions": {
"example_obj": {
"$id": "#/definitions/example_obj",
"type": "object",
"maxProperties": 1,
"properties": {
"or": {
"$id": "#/definitions/example_obj/properties/or",
"type": "array",
"items": {
"$id": "#/definitions/example_obj/properties/or/items",
"$ref": "#/definitions/example_obj"
}
},
"and": {
"$id": "#/definitions/example_obj/properties/and",
"type": "array",
"items": {
"$id": "#/definitions/example_obj/properties/and/items",
"$ref": "#/definitions/example_obj"
}
},
"value": {
"$id": "#/definitions/example_obj/properties/value",
"type": "string"
}
}
}
},
"type": "object",
"title": "The Root Schema",
"required": ["filter_version"],
"allOf": [
{
"$ref": "#/definitions/example_obj"
},
{
"properties": {
"filter_version": {
"$id": "#/properties/filter_version",
"type": "string",
"pattern": "^([0-9]+\.[0-9]+)$"
}
}
}
]
}
json 我要通过验证:
{
"filter_version": "1.0",
"or": [
{
"and": [
{
"value": "subject"
}
]
},
{
"or": [
{
"value": "another subject"
}
]
}
]
}
问题:
当我尝试为根定义扩展 example_obj
时,它似乎失败了,因为 example_obj
对象在设计上不允许超过 1 属性。
换句话说,似乎每次检查我添加到 example_obj
的参数数量也会对附加的 属性(即 filter_version
)执行。
有谁知道在哪里检查 'exactly 1 argument' 以便不在 root
对象上进行评估?
尝试次数:
我尝试使用不同的方法来确定 example_obj
的要求,但没有成功。就像将 "maxProperties": 1
替换为:
"oneOf": [
{
"required": [
"or"
]
},
{
"required": [
"and"
]
},
{
"required": [
"where"
]
},
{
"required": [
"where not"
]
}
],
在此先感谢您的帮助!!
正在使用 online schema validator 检查我的模式。
(最后我需要在 Python 中验证它,以防万一)
您可以使用 oneOf
而不是 maxProperties
来解决这个问题。
{
"type": "object",
"properties": {
"filter_version": {
"type": "string",
"pattern": "^([0-9]+\.[0-9]+)$"
}
},
"required": ["filter_version"],
"allOf": [{ "$ref": "#/definitions/example_obj" }],
"definitions": {
"example_obj": {
"type": "object",
"properties": {
"or": { "$ref": "#/definitions/example-obj-array" },
"and": { "$ref": "#/definitions/example-obj-array" },
"value": { "type": "string" }
},
"oneOf": [
{ "required": ["or"] },
{ "required": ["and"] },
{ "required": ["value"] }
]
},
"example-obj-array": {
"type": "array",
"items": { "$ref": "#/definitions/example_obj" }
}
}
}
P.S。您使用的 $id
有误。我知道有一个工具可以生成这样的模式并导致这种混乱。这里使用 $id
的方式是空操作。它没有坏处,但除了使您的架构膨胀之外没有任何作用。