2017-07-19 44 views
1

我的问题是如何知道使用哪个JSON模式来针对JSON进行验证?我在它的id字段中指定了模式的URL。这够了吗?我应该把这个ID放在JSON中吗?我不知道如何将JSON连接到特定的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 
      } 
     } 
    } 
} 

回答

0

据10.1 specification

它建议由一个模式描述的情况/ profile中提供 使用可下载JSON模式的链接链接关系 “描述”,如由关联数据协议1.0,第8.1节 [W3C.REC-ldp-20150226]所定义的。 (重点煤矿)

这似乎准确地描述你所需要的行为,但是,Linked Data Protocol section 8.1的休闲阅览留给我们仍然不明白:

的关系describedby乙断言资源B提供资源A的描述。对于A或B的格式或表示没有限制,在任何资源(重点矿)上都没有任何进一步的约束

快速谷歌搜索后,我发现这question,乍一看似乎是由您的问题重复。但是,经过深入的考察,问题实际上是关于模式内的继承,而不是从支持的实例中引用模式。

其中一个答案颇有趣,它提供了一个基于JSON-Hyper-schema标准的解决方案 - 试图扩展JSON模式标准以支持应用程序级语义的定义。

它实现这一点的方式是通过使用links collection的:

{ 
    ... 
    "links":[ 
     { 
     "rel":"describedby", 
     "href":"{+fileType}" 
     } 
    ] 
} 

事实证明,这是基于另一个标准RFC5988 - Web Linking这恰好是同一个标准,它使我们能够加载CSS到HTML页面。

由于@Jason在他的评论中指出 -

你的第一个报价,从规范的一个,就是做正确的方式。 所描述的链接数据定义与JSON 架构规范不矛盾。这是一个有意义的宽泛定义,因此可以将 应用于描述数据的任何介质类型。这包括JSON Schema,XML 架构或其他任何东西。

因此,它会出现,包括您的架构实例链接收集将参考架构的正确方法。因此,在特定情况下,你可以这样做:

{ 
    ... 
    "links":[ 
     { 
     "rel":"describedby", 
     "href":"url/schema.json" // I assume!! 
     } 
    ] 
} 

即使这可能是正确的,我不知道解决通过链路的实际架构时许多JSON解析器将如何尊重这一点。

+0

你的第一个报价,从规范的一个,就是做正确的方式。 'describeby'的链接数据定义与JSON Schema规范不矛盾。这是一个有目的广泛的定义,因此它可以应用于描述数据的任何媒体类型。这包括JSON Schema,XML Schema或其他任何东西。 – Jason

+0

谢谢@Jason我要更新我的答案 –

+0

谢谢澄清,但我的问题是,我有一个服务器上的2个Json模式,我有一个Json对象,我需要用一个模式来验证它。但我不知道是否应该将ID放在Json对象中以链接它们,或者如何仅获取该对象的模式。 – Maria

0

要添加和澄清Tom的答案,以下是如何将JSON文档链接到JSON模式的示例。在HTTP响应的上下文之外没有标准的做法。如果这是你需要的,你将不得不提出自己的策略。

GET /data/my-data HTTP/1.1

HTTP/1.1 200 OK 
Content-Type: application/json 
Link: </schema/my-schema> rel=describedby 

{ "name": "Fake Fakerson", "email": "[email protected]" } 

GET /schema/my-schema HTTP/1.1

HTTP/1.1 200 OK 
Content-Type: application/schema+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 
     } 
     } 
    } 
    } 
}