例如,文件系统的架构,目录包含文件列表。该模式由文件规范,下一个子类型“ image”和另一个“ text”组成。
在底部是主目录架构。目录具有属性内容,该属性内容是应作为文件子类型的项目的数组。
基本上,我正在寻找一种告诉验证器从正在验证的json对象中的属性中查找“ $ ref”的值的方法。
示例json:
{ "name":"A directory", "content":[ { "fileType":"http://x.y.z/fs-schema.json#definitions/image", "name":"an-image.png", "width":1024, "height":800 } { "fileType":"http://x.y.z/fs-schema.json#definitions/text", "name":"readme.txt", "lineCount":101 } { "fileType":"http://x.y.z/extended-fs-schema-video.json", "name":"demo.mp4", "hd":true } ] }
“伪”模式 说明“图像”和“文本”定义包含在同一模式中,但它们可能在其他位置定义
{ "id": "http://x.y.z/fs-schema.json", "definitions": { "file": { "type": "object", "properties": { "name": { "type": "string" }, "fileType": { "type": "string", "format": "uri" } } }, "image": { "allOf": [ { "$ref": "#definitions/file" }, { "properties": { "width": { "type": "integer" }, "height": { "type": "integer"} } } ] }, "text": { "allOf": [ { "$ref": "#definitions/file" }, { "properties": { "lineCount": { "type": "integer"}}} ] } }, "type": "object", "properties": { "name": { "type": "string"}, "content": { "type": "array", "items": { "allOf": [ { "$ref": "#definitions/file" }, { *"$refFromProperty"*: "fileType" } // the magic thing ] } } } }
仅JSON模式的验证部分无法做到这一点-它表示一个固定的结构。您需要的是在 验证时 解析/引用架构。
但是,您可以使用JSON Hyper-Schema和一个rel="describedby"链接来表达这一点:
rel="describedby"
{ "title": "Directory entry", "type": "object", "properties": { "fileType": {"type": "string", "format": "uri"} }, "links": [{ "rel": "describedby", "href": "{+fileType}" }] }
因此在这里,它从中获取值,"fileType"并使用它来计算具有“描述者”关系的链接-这意味着“此位置的模式还描述了当前数据”。
"fileType"
问题是大多数验证者对任何链接(包括“由…描述的”链接)都没有任何注意。您需要找到一个“超级验证器”。
更新 : tv4库已将此添加为功能