我同意,要么你选择object
要么string
类型。我查看了JSON Schema 文档,但找不到任何可以根据需要清楚地表达约束的内容。因此,我想到了对这两种方法的简短讨论。
类型字符串
JSON Schema 定义了七种原始类型,包括对象。字符串被简单地定义为 JSON 字符串。RFC 4627 定义如下 JSON 字符串
字符串是零个或多个 Unicode 字符的序列
这将适用于您的情况,即使必须限制字符串的内容。问题是如何传达限制。我会使用 adescription
来引用另一个子模式。您甚至可以 pattern
为字符串定义一个将子模式编码为正则表达式的方法。然而,这将非常容易出错并且根本不可读。但是,它可以用于更好地验证数据的模式。
{
"title": "My Schema",
"type": "object",
"properties": {
"A": {
"type": "string".
"description": "Please refer to http://... for the subschema."
},
"B": {
"type": "string"
"description": "Please refer to http://... for the subschema."
}
}
这样做的好处是,很明显 JSON 提供程序必须将字符串放入该属性中。缺点是不能将完整的模式视为一次,描述可能会被监督,查找过程也很麻烦。string
最后,当看到 type但object
在子模式中定义了a时,它会非常混乱。
类型对象
通过简单地使用类型,您可以避免使用字符串的所有缺点。这里的问题实际上是,说明必须是字符串编码的描述将被忽略。
{
"title": "My Schema",
"type": "object",
"properties": {
"A": {
"description": "Must be encoded as string",
"type": "object",
"properties": { "A1": { "type": "string" }, "A2": { "type": "string" } }
},
"B": {
"description": "Must be encoded as string",
"type": "object"
"properties": { "A1": { "type": "string" }, "A2": { "type": "string" } }
}
}
您总是可以完全伪造一些东西,例如使用类型string
并为其定义properties
,但这将是无效的 JSON Schema。
我建议您使用类型对象方法。虽然使用字符串类型存在这种约束,但总是会导致其背后的数据降级。可以通过其他方式强制执行约束。观察谁提供数据,将约束传达给各方,阻止与此约束相关的无效数据等。
谁知道呢,也许这个约束不会永远存在,如果这种情况发生变化,您将需要再次更改架构,在另一种情况下,您只需要删除说明字符串编码要求的注释。