Все схемы FHIR JSON не проверяются

Я пытаюсь использовать схему JSON, определенную на www.hl7.org/fhir/json.html, например 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») внутрь определения «Пациент», ошибка синтаксического анализа схемы будет исправлена, и я смогу правильно проверить некоторые образцы данных 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"
    },

Однако я заметил, что каждая схема JSON, определенная в http://hl7.org/fhir/json.html имеет такую ​​структуру. Ошибка в схемах JSON HL7 или в способе, которым www.jsonschemavalidator.net разбирает эти схемы JSON?

Насколько я понимаю, $ ref состоит в том, что "$ ref": "# / definitions / Patient" смотрит на ближайший родительский идентификатор для baseURL, который в данном случае:

"hl7.org/fhir/json-schema/Patient".

Этот URL-адрес должен обслуживать www.hl7.org/fhir/Patient.schema.json, который из корневого элемента должен иметь элемент схемы # / definitions / Patient, который соответствует текущему элементу, в котором определено $ ref. Таким образом, кажется, что правильное размещение $ ref действительно должно быть внутри # / definitions / Patient, а не в верхнем корневом # / месте, где в настоящее время находится ссылка.


person Ethan Port    schedule 15.06.2017    source источник


Ответы (1)


Схемы действительны. Я рекомендую другой онлайн-валидатор, который правильно обрабатывает ключевое слово $ref. Я рекомендую https://jsonschemalint.com (даже несмотря на то, что термин «ворс» используется неправильно). Он поддерживается AJV, поэтому вы можете быть уверены, что все сделано правильно.

Чтобы быть справедливым по отношению к www.jsonschemavalidator.net, это очень странное использование $ref. Технически это не неправильно, но необычно. Я рекомендую автору схемы встроить этот верхний уровень $ref. Будет более широкий спектр валидаторов, которые справятся с этим должным образом.

Возвращаясь к проблеме онлайн-проверки, даже с хорошим валидатором она не сработает. Если вы попробуете схему пациента с помощью https://jsonschemalint.com, вы получите сообщение об ошибке

не удается разрешить ссылочный DomainResource # / definitions / DomainResource из идентификатора http://hl7.org/fhir/json-schema/Patient#

Проблема в том, что схема пациента ссылается на схему в другом документе, который валидатор не может или не хочет получить. Если вы разрешите $ref против id, вы получите URI для нужной схемы, но я не знаю ни одного онлайн-валидатора, который бы это делал. Согласно спецификации схемы JSON, это не то поведение, на которое вы в любом случае можете полагаться.

Другой вариант - это онлайн-валидатор, который позволяет указать более одной схемы. Но я не видел ни одного с такой функцией.

Если онлайн-проверка так важна, вам, вероятно, придется самостоятельно настроить что-то специально для проверки на соответствие этим схемам. Сделать это довольно просто. Надеюсь, вы даже сделаете это общедоступным, чтобы другие тоже могли извлечь из этого пользу.

person Jason Desrosiers    schedule 23.06.2017
comment
Я пытаюсь использовать jsonschema с AJV для проверки данных публикации, но получаю ошибку превышения максимального размера стека вызовов. Наверное, из-за саморекламы. Есть решение, как это исправить? Спасибо - person Pietro; 28.12.2017