难以对齐 JSONschema 和 XSD 等效项

Difficulty aligning JSONschema and XSD equivalent

我有一个问题,我无法自己解决。所以我试图在 Whosebug 上寻求帮助。

我正在生成 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 中构建这个结构。有谁知道如何面对 "integer in arrays in array" 问题?

要补充一点:如果 json-代码看起来像这样:

"factors": [ "items":{ [12,3], [1,14] } ] 

我不会有问题,因为我可以将 "factors-array" 的内容表达为

<xs:element name="items" type="integer" max0occurs="unbounded"/> 

但是里面的数组结构只有整数,没有元素!

为避免否决票,请清理您的 "would" JSON 示例,因为 "factors": [ "items":{ [12,3], [1,14] } ] 的格式不正确 JSON。格式正确的可能如下所示(当然,请随意更正它以反映您想要的内容,至少我们的工具会按照您分享的 XSD 片段中的方式生成它):

{
    "factors": [
        {
            "items": [ 12, 3 ]
        },
        {
            "items": [ 1, 14 ]
        }
    ]
}

你的问题有一个简单的答案:没有办法做到这一点,除非你依赖 XSD.

中的专有标记

在XML中,表示数据需要某种标记;一个文本节点和一个属性需要一个元素来 "hold" 它们。在 XSD 中,您可以使用 <xsd:list/> 来建模整数数组;即使那样,使用它也需要一个(n)(重复)元素来使它成为一个数组的数组(或者,该元素可以包装在一个重复的合成器中,通常是一个<xsd:sequence/>)。

因为这个必备元素,我知道的任何转换器都会自动创建对象(其中 object 由 JSON Schema Draft 定义)并使用用于创建 属性 的元素 and/or 属性的名称。您的数组数组没有对象,因此不允许 属性,因此您不能依赖核心 XSD 构造来进行这种转换。

三年来,我们一直在根据真实 XSD 进行 XSD 到 JSD 的转换,因此我们对这种转换做了相当多的改进。为了实现像您这样的场景,我们在 <xsd:appinfo/> 中定义了专有标记:它指示转换引擎跳过创建 属性 等关联对象的创建。我建议您更改基于 Python 的解析器,以便它考虑某种 "hints",无论是我们这样做的方式,还是通过创作模式(如果您希望不加区别地应用它们)。