我正在尝试使用www.hl7.org/fhir/json.html中定义的JSON模式,例如www.hl7.org/fhir/Patient.schema.json。
架构以:
开头{
"$schema": "http://json-schema.org/draft-04/schema#",
"id": "http://hl7.org/fhir/json-schema/Patient",
"$ref": "#/definitions/Patient",
"description": "see http://hl7.org/fhir/json.html#schema for information
about the FHIR Json Schemas",
"definitions": {
"Patient": {
"allOf": [
{
"$ref": "DomainResource#/definitions/DomainResource"
},
当我将其粘贴到[www.jsonschemavalidator.net] [3]时,我收到错误
解析模式引用'#/ definitions / Patient'时出错。路径'',第1行,第1位。
如果我在“Patient”定义中移动第4行(“$ ref”:“#/ definitions / Patient”),架构解析错误是固定的,我可以正确验证一些示例JSON数据。
{
"$schema": "http://json-schema.org/draft-04/schema#",
"id": "http://hl7.org/fhir/json-schema/Patient",
"description": "see http://hl7.org/fhir/json.html#schema for information
about the FHIR Json Schemas",
"definitions": {
"Patient": {
"$ref": "#/definitions/Patient",
"allOf": [
{
"$ref": "DomainResource#/definitions/DomainResource"
},
但是,我注意到http://hl7.org/fhir/json.html定义的每个JSON模式都是以这种方式构建的。是HL7 JSON模式中的错误,还是www.jsonschemavalidator.net解析这些JSON模式的方式?
我对$ ref的理解是“$ ref”:“#/ definitions / Patient”查看baseURL最近的父ID,在这种情况下是:
“hl7.org/fhir/json-schema/Patient”。
此URL应该提供www.hl7.org/fhir/Patient.schema.json,它来自根元素,应该有一个架构元素#/ definitions / Patient,它对应于定义$ ref的当前元素。所以似乎$ ref的正确放置应该在#/ definitions / Patient中,而不是在ref当前所在的上根#/ location中。
答案 0 :(得分:0)
模式有效。我建议使用一个不同的在线验证器来正确处理$ref
关键字。 https://jsonschemalint.com是我的建议(尽管它错误地使用了“lint”一词)。它得到了AJV的支持,所以你可以确定它已经正确完成了。
为了公平对待www.jsonschemavalidator.net,这是对$ref
的一种非常奇怪的用法。这在技术上并不错,但这是不寻常的。我对模式作者的建议是内联顶级$ref
。将有更广泛的验证器可以正确处理它。
回到在线验证问题,即使有一个好的验证器,它也不会起作用。如果您使用https://jsonschemalint.com尝试患者架构,则会收到错误
无法解析来自身份http://hl7.org/fhir/json-schema/Patient#的参考DomainResource#/ definitions / DomainResource
问题是Patient模式引用了不同文档中的模式,验证者无法或不会获取该模式。如果您针对$ref
解析id
,您将获得所需架构的URI,但我知道没有在线验证器可以执行此操作。根据JSON Schema规范,这不是您可以依赖的行为。
另一个选项是在线验证器,允许您指定多个架构。但是,我还没有看到有这个功能的人。
如果在线验证很重要,您可能需要自己设置一些专门用于验证这些模式的内容。这很容易做到。希望你甚至可以将它公开,以便其他人也可以受益。