При попытке решить эту проблему важно знать, где и как Jschema хранит определения, и что вы можете перемещаться по схеме аналогично JObject.
Итак, при условии, что вы загрузили схему следующим образом (используя Newtonsoft):
var schema = JSchema.Parse(@"{
'definitions': {
'img': {
'type': 'object',
'properties': {
'url': {
'type': 'string'
}
}
}
},
'type': 'object',
'properties': {
'name': {
'type':'string'
},
'avatar': {
'$ref': '#/definitions/img'
}
}
}");
при доступе к avatar свойству схемы вы фактически получите уже замененную ссылку с определением (так как Jschema заменяет ее во время синтаксического анализа). Но само определение не потеряно, а хранится в schema.ExtensionData["definitions"]
- что для меня было неожиданностью в начале - и вы можете получить доступ к этим определениям, как к стандартным объектам JObjects.
При определенных условиях (например, имея одно определение с url токеном) вы можете получить доступ к фактическому типу определения:
var avatarKey = schema.Properties["avatar"].Properties.Keys.Single(); //'url'
var definitions = schema.ExtensionData["definitions"];
Затем получите определение, содержащее url и получите корневое имя ( img в вашем сценарии):
var matching = definitions.SelectTokens($"..{avatarKey}");
var avatarDefinition = matching.Single().Root;
var avatarType = (avatarDefinition.First() as JProperty).Name; //'img'
Это не универсальное решение для каждой схемы, но на его основе вы можете настроить его для более сложных потребностей.