从JSON引用JSON模式的方式与XML引用XML模式的方式类似

时间:2019-02-28 10:57:23

标签: json xsd jsonschema

当我定义了XML模式时,我可以用这种方式从XML引用它,说该XML必须与所引用的模式相对应。这样,我可以强制验证此类XML,也可以为将要编辑此文件的人提供宝贵的提示,因为支持XML Schema的XML编辑器将使用此类引用来生成自动完成功能,从而使编辑变得更加容易。

但是,我在JSON Schema文档中看不到这种引用。 例如:https://json-schema.org/learn/getting-started-step-by-step.html

它似乎不是标准的一部分,或者我只是找不到它。

以下是带有参考用法的XSD架构示例:

<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 Schema自动完成此操作。

但是JSON Schema呢?

如果我有这样的JSON模式:

{
  "$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实际链接到我希望它对应的Schema?

1 个答案:

答案 0 :(得分:2)

您是正确的,它不是标准的一部分。

对于作为HTTP响应返回的JSON,您可以使用标头指出响应JSON由特定的JSON模式描述。

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

  

建议架构描述的实例提供链接   使用链接关系“ describeby”到可下载的JSON模式,
  根据链接数据协议1.0第8.1节的定义
  [W3C.REC-ldp-20150226]。

     

在HTTP中,可以使用链接将此类链接附加到任何响应   标头[RFC8288]。此类标头的示例为:

     

链接:http://example.com/my-hyper-schema#; rel =“ describeby”