如何指定 JSON 实例由特定的 JSON Schema 定义

Mar*_*ria 5 java json jsonschema

我的问题是如何知道使用哪个 JSON 模式来验证特定的 JSON 文档?我在 id 字段中指定了模式的 URL。这够了吗?我应该把 id 放在 JSON 中吗?我不确定我是否了解如何将 JSON 连接到特定的 JSON 架构。

这是我的架构

{
 "$schema": "http://json-schema.org/draft-04/schema#",
 "id": "url/schema.json",
 "title": "title",
 "definitions": {
    "emailObject": {
        "type": "object",
        "properties":{
            "name": {
                "description": "The name of the customer",
                "type": "string",
                "maxLength": 200
            },
            "email": {
                "description": "The email of the customer",
                "type": "string",
                "format": "email",
                "maxLength": 100
            }
        }
    }
 }
Run Code Online (Sandbox Code Playgroud)

tom*_*ern 1

根据规范10.1

建议模式/配置文件描述的实例使用链接关系“ descriptedby ”提供可下载 JSON 模式的链接,如链接数据协议 1.0 第 8.1 节 [W3C.REC-ldp-20150226] 所定义。(强调我的)

这似乎准确地描述了您所需要的行为,但是,仔细阅读链接数据协议第 8.1 节,我们仍然一无所知:

B描述的关系 A断言资源 B 提供了资源 A 的描述。对 A 或 B 的格式或表示没有任何限制,对任一资源也没有任何进一步的限制(强调我的)

经过快速谷歌搜索后,我发现了这个问题,乍一看似乎与您的问题重复。然而,经过更深入的检查,问题实际上是关于模式内的继承,而不是关于模式从其支持的实例的引用。

有趣的是,其中一个答案提供了一种利用 JSON-Hyper-schema 标准的解决方案 - 尝试扩展 JSON-schema 标准以支持应用程序级语义的定义。

它实现这一点的方法是使用links集合

{
   ...
   "links":[
      {
         "rel":"describedby",
         "href":"{+fileType}"
      }
   ]
}
Run Code Online (Sandbox Code Playgroud)

事实证明,这是基于另一个标准RFC5988 - Web Linking,它恰好是允许我们将 CSS 加载到 HTML 页面中的相同标准。

正如@Jason 在他的评论中指出的那样 -

您的第一个报价(来自规范)是正确的方法。generated by 的链接数据定义与 JSON Schema 规范并不矛盾。这是一个特意宽泛的定义,因此它可以应用于描述数据的任何媒体类型。其中包括 JSON 架构、XML 架构或其他任何内容。

因此,在架构实例中包含链接集合似乎是引用架构的正确方法。因此,根据您的具体情况,您可以这样做:

{
   ...
   "links":[
      {
         "rel":"describedby",
         "href":"url/schema.json" // I assume!!
      }
   ]
}
Run Code Online (Sandbox Code Playgroud)

尽管这可能是正确的,但我不知道有多少 JSON 解析器在通过链接解析为实际模式时会尊重这一点。