在任何xml文件中,我可以说我使用xmlns-attributes描述命名空间的命名空间。这里有很好的描述:What does "xmlns" in XML mean?
然后我可以使用具有目标命名空间的xml架构,以便每个人都知道架构描述了该命名空间。关于这方面的一个问题可以在这里找到:Why do we need targetNamespace?
使用json-schema我们可以为json文档定义模式。我的心智模型是,这大致相当于拥有一个xsd文件。
现在,如何在json对象中引用架构?我可以使用$schema
属性引用模式,但是如何声明我自己开发的模式的名称?我不明白targetNamespace
答案 0 :(得分:2)
研究写这个问题我找到了答案。等同于targetNamespace
的是$id
属性。标准声明......
“$ id”关键字定义架构的URI,以及基本URI 解析模式中的其他URI引用。一个 subschema的“$ id”是根据其父级的基URI解析的 架构。如果没有父级使用“$ id”设置显式基,则基URI为 根据RFC 3986第5节确定的整个文档的内容 [RFC3986]。
...这是$schema
...
“$ schema”关键字都用作JSON Schema版本标识符 和资源的位置本身就是一个JSON Schema,它 描述为此特定版本编写的任何模式。价值 这个关键字必须是一个URI [RFC3986](包含一个方案)和这个 URI必须规范化。当前架构必须对有效 由此URI标识的元架构。
经过一些更多的研究后,我得出结论,上述 - 尽管是正确的 - 并没有提供完整的故事。关于在数据中使用$schema
属性的一些补充:
a)在模式中使用$schema
来定义应该使用哪个模式来定义自己的自定义模式。规范中没有说明任何类型的对象中的$schema
都应该表明模式的验证。
b)您可能在您的架构中定义$schema
应该指示用于验证的架构。
c)还有其他方法可以指示数据的架构。一个这样的例子是在http头中使用内容类型。另一种方法是使用链接http头。
d)vscode和visual studio都将$schema
解释为对用于验证的模式的引用
此问题已在github repo中针对规范进行了讨论。
https://github.com/json-schema/json-schema/issues/235
https://github.com/json-schema/json-schema/issues/220#issuecomment-209452992