难以对齐 JSONschema 和 XSD 等效项
Posted
技术标签:
【中文标题】难以对齐 JSONschema 和 XSD 等效项【英文标题】:Difficulty aligning JSONschema and XSD equivalent 【发布时间】:2016-12-01 09:36:15 【问题描述】:我有一个问题,我无法自己解决。所以我想在 *** 寻求帮助。
我正在生成 XSD 并使用基于 python 的转换器将 XSD 转换为 JSON 模式。 JSON 模式用于验证 JSON 代码,我不会详细解释。我的问题是,我有 JSON 代码来验证其中包含一个数组,该数组包含包含整数的数组(复数)。
JSON 代码如下所示:
"factors": [
[12,3],
[1,14]
]
我知道如何为此编写 JSON 架构:
"factors":
"items":
"$ref": "#/definitions/factorscontent"
,
"type": "array"
...
"factorscontent":
"items":
"type": "integer"
,
"type": "array",
"properties":
这很好用。但我不知道如何在 XSD 中构建这种结构。有谁知道如何面对“数组中的整数”问题?
要补充一点:如果 json 代码如下所示:
"factors": [ "items": [12,3], [1,14] ]
我不会有问题,因为我可以将“因子数组”的内容表示为
<xs:element name="items" type="integer" max0occurs="unbounded"/>
但是里面的数组结构只包含整数,没有元素!
【问题讨论】:
要补充一点:如果 json 代码看起来像这样: "factors": [ "items":[12,3], [1,14] ] 我不会有一个问题,因为我可以将“因子数组”的内容表示为为避免投票,请清理您的“愿意”JSON 示例,因为 "factors": [ "items": [12,3], [1,14] ]
根本不是格式正确的 JSON。格式良好的文件可能如下所示(当然,请随时更正它以反映您想要的内容,至少我们的工具会按照您共享的 XSD sn-p 的方式生成它):
"factors": [
"items": [ 12, 3 ]
,
"items": [ 1, 14 ]
]
您的问题有一个简单的答案:没有办法做到这一点,除非您依赖 XSD 中的专有标记。
在 XML 中,表示数据需要某种标记;文本节点和属性需要一个元素来“保存”它们。在 XSD 中,您可以使用 <xsd:list/>
对整数数组建模;即使这样,使用它也需要一个(n)(重复)元素来使其成为数组数组(或者,该元素可以包装在重复合成器中,通常是<xsd:sequence/>
)。
由于这个必备元素,我知道的任何转换器都会自动创建对象(其中 object 由 JSON Schema Draft 定义)并使用元素和/或属性的名称来创建一个属性。您的数组数组没有对象,因此不允许使用任何属性,因此您不能依赖核心 XSD 构造进行这种转换。
三年来,我们一直在针对真正的 XSD 进行 XSD 到 JSD 的转换,因此我们对这种转换进行了相当多的改进。为了实现像您这样的场景,我们在<xsd:appinfo/>
中定义了一个专有标记:它指示转换引擎跳过创建属性以及关联对象的创建。我建议您更改基于 Python 的解析器,以便它考虑某种“提示”,无论是我们这样做的方式,还是通过创作模式(如果您希望不加选择地应用它们)。
【讨论】:
非常感谢您的详细而有帮助的回答。我感谢你的努力。因为 xsd 和 json 模式并不难理解,所以我已经在想“它可能不起作用”。所以现在我知道了。而且我认为,最简单的方法是针对特定问题更改 python 脚本,就像你推荐的那样。以上是关于难以对齐 JSONschema 和 XSD 等效项的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法将 JSON Schema 转换为 XSD? [关闭]
JsonSchema和JsonSchemaValidator
[Grid.IsSharedSizeScope Windows 8等效项
JSON:对于 JSON 和 JSON Schema,是不是有等效的 Schematron? (即一种表示协约束的JSON技术)