Как решить одну ссылку с помощью Python jsonschema RefResolver - PullRequest
0 голосов
/ 24 сентября 2019

Я пишу код Python для проверки файла .csv с использованием схемы JSON и модуля Python jsonschema.У меня есть схема клинического манифеста, которая выглядит следующим образом:

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "http://example.com/veoibd_schema.json",
  "title": "clinical data manifest schema",
  "description": "Validates clinical data manifests",
  "type": "object",
  "properties": {
    "individualID": {
      "type": "string",
      "pattern": "^CENTER-"
    },
    "medicationAtDx": {
      "$ref": "https://raw.githubusercontent.com/not-my-username/validation_schemas/reference_definitions/clinicalData.json#/definitions/medicationAtDx"
    }
  },
  "required": [
    "individualID",
    "medicationAtDx"
  ]
}

Схема, на которую ссылается $ ref, выглядит следующим образом:

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "http://example.com/clinicalData.json",
  "definitions":{
    "ageDxYears": {
      "description": "Age in years at diagnosis",
      "type": "number",
      "minimum": 0,
      "maximum": 90
    },
    "ageOnset": {
      "description": "Age in years of first symptoms",
      "type": "number",
      "exclusiveMinimum": 0
    },
    "medicationAtDx": {
      "description": "Medication prescribed at diagnosis",
      "type": "string"
    }
  }
}

(Обратите внимание, что обе схемы немного больше по размеруи был отредактирован для краткости.)

Мне нужно иметь возможность выяснить «тип» «medicationAtDx», и я пытаюсь выяснить, как использовать jsonschema.RefResolver для отмены ссылки, но янемного потерян в терминологии, используемой в документации, и не может найти хороший пример, который объясняет, что это за параметры и что он возвращает «маленькими словами», то есть то, что легко понять начинающему пользователю JSON-схемы.

Я создал RefResolver из схемы клинического манифеста:

testref = jsonschema.RefResolver.from_schema(clin_manifest_schema)

Я ввел ему URL в «$ ref»:

meddx_url = "https://raw.githubusercontent.com/not-my-username/validation_schemas/reference_definitions/clinicalData.json#/definitions/medicationAtDx"

testref.resolve_remote(meddx_url)["definitions"].keys()

То, что я ожидал получить, было:

dict_keys(['medicationAtDx'])

То, что я на самом деле получил, было:

dict_keys(['ageDxYears', 'ageOnset', 'medicationAtDx'])

Это ожидаемое поведение?Если нет, то как я могу сузить его до определения «medicationAtDx»?Я могу обойти весь словарь, чтобы получить то, что я хочу, если мне нужно, но я бы предпочел, чтобы он возвращал только нужную мне ссылку.

Заранее спасибо!

ETA: согласно Relequestual'sКомментарий ниже, я сделал пару проходов с resol_fragment следующим образом:

ref_doc = meddx_url.split("#")[0]
ref_frag = meddx_url.split("#")[1]
testref.resolve_fragment(ref_doc, ref_frag)

Это дает мне «TypeError: строковые индексы должны быть целыми числами» и «RefResolutionError: Unresolvable JSON pointer».Я попытался настроить параметры по-разному (добавив «#» обратно во фрагмент, убрав косую черту и т. Д.), И получил те же результаты.Relequestual объяснение фрагмента было очень полезно, но, видимо, я до сих пор не понимаю точные параметры, которые ожидает resol_fragment.

...