【问题标题】:All FHIR JSON schema do not validate所有 FHIR JSON 模式均未验证
【发布时间】:2017-11-18 13:41:18
【问题描述】:

我正在尝试使用 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。

如果我将第 4 行 ("$ref": "#/definitions/Patient") 移到“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 当前所在的上根 #/ 位置。

【问题讨论】:

标签: json jsonschema hl7 json-schema-validator


【解决方案1】:

架构有效。我推荐一个不同的在线验证器来正确处理$ref 关键字。 https://jsonschemalint.com 是我的建议(即使它错误地使用了术语“lint”)。它由 AJV 提供支持,因此您可以确保它已正确完成。

为了公平起见 www.jsonschemavalidator.net,这是 $ref 的一个非常奇怪的用法。这在技术上并没有错,但很不寻常。我对架构作者的建议是内联顶级$ref。将会有更广泛的验证器来正确处理它。

回到在线验证问题,即使有一个好的验证器,它也行不通。如果您尝试使用 https://jsonschemalint.com 的 Patient 模式,则会收到错误

无法解析来自 id http://hl7.org/fhir/json-schema/Patient# 的引用 DomainResource#/definitions/DomainResource

问题在于 Patient 架构引用了验证器无法或不会获取的不同文档中的架构。如果您将$refid 解析,您将获得所需架构的URI,但我知道没有在线验证器可以这样做。根据 JSON Schema 规范,无论如何这都不是您可以依赖的行为。

另一个选项是允许您指定多个模式的在线验证器。但是,我还没有看到有这个功能的。

如果在线验证如此重要,您可能需要自己设置一些专门用于针对这些模式进行验证的东西。这很容易做到。希望您甚至将其公开,以便其他人也可以受益。

【讨论】:

  • 我正在尝试使用带有 AJV 的 jsonschema 进行发布数据验证,但出现“超出最大调用堆栈大小”错误。可能是因为自引用。有解决这个问题的方法吗?谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-08
  • 2021-12-28
  • 1970-01-01
  • 2020-11-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多