从JSON中引用JSON Schema的方式与XML引用XML Schema的方式类似。

3
当我定义了XML Schema后,我可以通过引用它来指定XML必须对应于所引用的模式。这样,我可以强制验证此类XML,并为将要编辑此文件的人提供有价值的提示,因为支持XML Schema的XML编辑器将使用此引用生成自动完成,从而使编辑更加容易。
然而,我在JSON Schema文档中没有看到这样的引用。 例如:https://json-schema.org/learn/getting-started-step-by-step.html 看起来它不是标准的一部分,或者我只是找不到它。
以下是使用引用的XSD Schema示例:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            targetNamespace="http://example.org/definitions/product">
    <xsd:element name="product">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="id" type="xsd:long" maxOccurs="1" minOccurs="1"/>
                <xsd:element name="name" type="xsd:string" maxOccurs="1" minOccurs="1"/>
                <xsd:element name="description" type="xsd:string" minOccurs="0" maxOccurs="1" />
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>

这里有一个使用该模式的XML,通过引用它的逻辑名称:http://example.org/definitions/product

<product:product xmlns:product="http://example.org/definitions/product">
    <id>1</id>
    <name>One</name>
    <description>The One</description>
</product:product>

现在任何人都可以开始编辑它,并且如果支持的话,可以基于引用的 XSD 模式在他们的编辑器中获得自动完成。但是 JSON Schema 呢?如果我有这样的 JSON Schema:
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "http://example.org/definitions/product",
  "title": "product",
  "type": "object",
  "properties": {
    "id": {
      "type": "long"
    },
    "name": {
      "type": "string"
    },
    "description": {
      "type": "string"
    }
  },
  "required": [ "id", "name" ]
}

实际的JSON如下:

{
  "id": 1,
  "name": "One",
  "description": "The one"
}

那么我应该如何将JSON链接到对应的模式?

http://example.org/definitions/product 不是模式的逻辑名称。它是您在文档中使用的命名空间URI,您还有一个模式恰好具有该命名空间中某些元素的定义。命名空间可以拥有比模式更多的内容,并且可以为命名空间提供多个模式。没有1:1映射关系。也许您指的是 xsi:schemaLocation (xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="...")。 - Erwin Bolwidt
感谢您的纠正!我的观点是强调它不是模式或其他任何实际位置,而更像是唯一标识符,这并不是问题的本质。 - alebu
1个回答

4

你是正确的,这不是标准的一部分。

对于作为HTTP响应返回的JSON数据,你可以使用一个头部来说明该响应的JSON数据由特定的JSON模式进行描述。

https://datatracker.ietf.org/doc/html/draft-handrews-json-schema-01#section-10.1

建议由模式进行描述的实例提供一个链接,链接关系为“describedby”,
如Linked Data Protocol 1.0第8.1节[W3C.REC-ldp-20150226]定义。
在HTTP中,这些链接可以附加到任何响应中,使用Link头部[RFC8288]。
这样的头部示例如下所示:

Link: http://example.com/my-hyper-schema#; rel="describedby"


需要注意的是,词汇表(即将发布的草案2019-03的一个特性,是草案07的后继版本)将通过允许作者添加新关键字来实现类似于此功能。我想象任何支持新草案的编辑器都会自动完成词汇表定义的关键字。 - gregsdennis
1
我不喜欢JSON模式草案的建议:通过将模式链接放在文档之外,它忽略了文档单独可用的情况。在这种情况下,有关使用的模式的信息不可用。我猜这是因为将其作为JSON文档的一部分包含需要更改JSON规范?无论如何,我的抱怨是关于草案,而不是你的答案。 - dzieciou
1
我明白。(我也是起草计划的人之一!)我们无法控制JSON规范,也无能为力。已经有很多关于如何允许实例/ JSON数据标识符符合模式的建议或推荐的讨论,但实际情况并不像你想象的那样简单。存在复杂的问题,并且StackOverflow不是列出或讨论它们的地方 =] GH某处有问题。欢迎加入我们的Slack =] - Relequestual

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接