gpt4 book ai didi

数组内的 JSON-Schema 模式重复

转载 作者:行者123 更新时间:2023-12-05 05:26:19 24 4
gpt4 key购买 nike

有没有办法为 JSON 架构文档数组中的元素创建重复模式。我想用它来验证查询生成器工具生成的查询。

我目前使用的架构部分是

"complexCondition": {
"anyOf": [
{
"title": "Simple condition, e.x. X==0",
"type": "string"
},
{
"type": "array",
"items": [
{
"$ref": "#/complexCondition"
},
{
"type": "string", "enum": ["AND","OR"]
},
{
"$ref": "#/complexCondition"
}
],
"additionalItems": false
}
]
}

这允许我正确验证查询“conditionA && conditionB && conditionC”为

[[conditionA,"AND",conditionB],"AND",conditionC]

但是,我希望能够并验证查询存储为

的文档
[conditionA,"AND",conditionB,"AND",conditionC]

这在任何条件下都可以实现。

最佳答案

为了实现您打算做的事情,您需要为奇数和偶数位置定义规则在数组中,对于使用 json-schema 的任何长度的数组都无法完成。

如果您预期的查询条件数量不会无限增长,您可以硬编码 items 关键字中的前 n 个位置:

"items":[{"$ref":"#/condition},{"$ref":"#/operator"},{"$ref":"#/condition},{"$ref":"#/operator"} ... 等]

在这种情况下,您仍然会遇到定义以“operator”结尾的错误条件的问题。其他选择是制作“oneOf”并构建每个可能性(这可以通过脚本自动执行,我猜你不会有包含 100 个子句的表达式......)

无论如何,我觉得试图扁平化一个本质上是递归的概念有点奇怪。你将如何存储这个 ((A OR B) OR (C AND B))?

因此,如果您仍然可以重新考虑所需的序列化架构格式,我建议您采用递归方法。像这样的东西:

"predicate" : {
"type" : "array",
"items" : {
"$ref" : "#/clause"
}
}

"clause" : {
"type" : "array",
"items" : [{
"$ref" : "#/condition"
}
],
"additionalItems" : {
"type" : "array",
"items" : [{
"$ref" : "#/operator"
}, {
"$ref" : "#/clause"
}
]
}
}

生成的字符串更难看,但使用简单的递归函数解析它会相当容易:

简单条件:

[["condition1"]]

简单从句:

[["condition1",["OR",["condition2"]]]

在同一级别添加子句

[["condition1",["OR",["condition2"]],["OR",["condition3"]]]

向子级别添加子句

[["condition1",["OR",["condition2"]],["OR",["condition3", ["AND",["condition4"]]]]]

关于数组内的 JSON-Schema 模式重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26927525/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com