Mah*_*oni 1 javascript schema json schema-design jsonschema
在我的JSON序列化数据中,我有嵌套对象:
{
"A" : { "A1": 1,
"A2": 2 },
"B" : { "B1": 3,
"B2": 4 }
}
Run Code Online (Sandbox Code Playgroud)
由于给定的约束我无法影响,我需要压扁结构.这意味着,深度大于1的每个对象都必须编码为字符串.应用于上面的例子,这是这样的:
{
"A" : "\{\"A1\": 1, \"A2\": 2\}"
"B" : "\{\"B1\": 3, \"B2\": 4\}"
}
Run Code Online (Sandbox Code Playgroud)
因为我需要在JSON Schema中表达这个约束,所以我几乎要遵循它的语法规则.我猜这些对象的类型将是string
或者object
.
{
"title": "My Schema",
"type": "object",
"properties": {
"A": {
"type": "string vs. object"
"B": {
"type": "string vs. object"
}
Run Code Online (Sandbox Code Playgroud)
我同意,无论你选择object
还是string
打字.我已经查看了JSON Schema文档,但我找不到任何可以根据需要明确表达约束的内容.因此,我想到了两种方法的简短讨论.
键入字符串
JSON Schema定义了七种基本类型,包括object.字符串简单地定义为JSON字符串.RFC 4627定义了一个JSON字符串,如下所示
字符串是零个或多个Unicode字符的序列
这适用于您的情况,即使必须限制字符串的内容.问题是如何传达限制.我会用a description
来引用另一个子模式.您甚至可以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."
}
}
Run Code Online (Sandbox Code Playgroud)
这样做的好处是,JSON提供程序必须将字符串放入该属性,这一点明确无误.缺点是完整的模式不能被视为一次,描述可能被监督,并且在查找过程中也很麻烦.最后看到类型时会非常混乱,string
但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" } }
}
}
Run Code Online (Sandbox Code Playgroud)
你总是可以做一些完全虚假的事情,比如使用类型string
并properties
为它定义,但这将是无效的JSON Schema.
我建议你使用Type Object方法.虽然存在这种约束,但使用字符串类型总是会导致其后面的数据降级.可以通过其他方式强制执行约束.观察谁提供数据,将约束传达给所有各方,阻止与此约束无关的数据等.
谁知道,也许这种约束不会永远存在,如果发生变化,你需要再次更改模式,在另一种情况下你只需要删除注释,说明字符串编码的要求.
归档时间: |
|
查看次数: |
917 次 |
最近记录: |