Я пишу код 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.