所有FHIR JSON架构都不验证

时间:2017-06-15 22:34:55

标签: json jsonschema hl7 json-schema-validator

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

1 个答案:

答案 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规范,这不是您可以依赖的行为。

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

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