【发布时间】:2021-08-16 14:02:56
【问题描述】:
我们目前正在考虑从基于代码的验证转移到 JSON 架构驱动的验证器。
我们的一个常见场景是在一个有序数组中更改一个数组项中的验证标准,具体取决于它之前的数组项的值。一个通用示例是数组项表示电子表格中的列或行。
这是否可以使用现有系统(例如 if-then)来实现?如果是的话怎么办?
非常感谢
【问题讨论】:
标签: json jsonschema
我们目前正在考虑从基于代码的验证转移到 JSON 架构驱动的验证器。
我们的一个常见场景是在一个有序数组中更改一个数组项中的验证标准,具体取决于它之前的数组项的值。一个通用示例是数组项表示电子表格中的列或行。
这是否可以使用现有系统(例如 if-then)来实现?如果是的话怎么办?
非常感谢
【问题讨论】:
标签: json jsonschema
一个通用示例是数组项表示电子表格中的列或行。
我不希望架构或类型定义语言能够处理这个问题。相反,我建议考虑根据列信息动态生成 json 模式,然后将 json 的其余部分(使用生成的模式)处理给验证器。
【讨论】:
根据您的约束条件,您可以使用 JSON Schema 做一些事情。您不能进行相对索引,例如:如果数组项的值为“foo”,则它之前/之后的项目必须是大于 3 的数字。但您可以表示:如果索引 2 处的项目是“ foo",则索引 3 处的项目必须是大于 3 的数字。但是,您仅限于静态断言,这意味着您不能对一个字段相对于另一个字段的值进行断言。例如,可以表示:索引 2 处的项大于索引 3 处的项。
这是您可以做出的断言类型的示例。这表达了上一段中给出的示例:如果索引 2 处的项目是“foo”,那么索引 3 处的项目必须是大于 3 的数字。
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "array",
"prefixItems": [
{ "type": "boolean" },
{ "type": "string" },
{ "type": "string" },
{ "type": "number" }
],
"if": {
"type": "array",
"prefixItems": [
true,
true,
{ "const": "foo" }
],
"minItems": 3
},
"then": {
"prefixItems": [
true,
true,
true,
{ "exclusiveMinimum": 3 }
]
}
}
如果您使用的是早于 2020-12 的草稿,则可以将 prefixItems 更改为 items 以获得相同的结果。一般模式是在顶层表达模式的一般约束,然后是下面的条件。我们希望if 匹配第三个值并且不关心前两个值,因此我们可以将true 或{} 存根放在这些插槽中。同样的概念适用于then。如果您有很多项目,这可能会导致很多trues,但是没有办法解决它,因为无法指定架构适用的索引。 minItems 也很重要,否则如果第三项不存在,if 将匹配。
【讨论】: