У меня есть схема Json, у которой есть относительная ссылка на файл, например:
{
"$id": "TestPacket",
"title": "TestPacket",
"type": "object",
"properties": {
"Header": {
"$ref": "../../TestSchema/Test/TestHeader.json#"
},
"Body": {
"$ref": "../../TestSchema/Test/Test.json#"
}
}
Test.json также имеет относительную ссылку на файл:
{
"$id": "Test",
"title": "Test",
"type": "object",
"properties": {
"Group": {
"title": "Group",
"type": "string"
},
"Child": {
"$ref": "../../TestSchema/Test/Child.json#"
}
},
"required": [
"Version",
"Group"
]}
И Quicktype, и XMLSpy способны успешно проанализировать это (я пробовал много, много разных методов, помимо паттерна "../../folder/folder", и это лучше всего подходит для того, к чему мы стремимся).
Моя проблема возникает, когда я пытаюсь использовать проверку схемы Json.Net. В настоящее время мы встраиваем json в сборку и используем JSchemaPreloadedResolver для их разрешения, например:
JSchemaPreloadedResolver resolver = new JSchemaPreloadedResolver();
resolver.Add(new Uri(TestSchema/Test/Test.json", UriKind.RelativeOrAbsolute, assembly.GetManifestResourceStream("SchemaTests.TestSchema.Test.Test.json"));
resolver.Add(new Uri(TestSchema/Test/Child.json", UriKind.RelativeOrAbsolute, assembly.GetManifestResourceStream("SchemaTests.TestSchema.Test.Child.json"));
resolver.Add(new Uri(TestSchema/Test/TestPacket.json", UriKind.RelativeOrAbsolute, assembly.GetManifestResourceStream("SchemaTests.TestSchema.Test.TestPacket.json")); resolver.Add(new Uri(TestSchema/Test/TestHeader.json", UriKind.RelativeOrAbsolute, assembly.GetManifestResourceStream("SchemaTests.TestSchema.Test.TestHeader.json"));
Когда я загружаю JSchema из JsonReader, используя этот распознаватель, он прекрасно работает, пока отсутствует ссылка на 2-ю подсхему. Фактически, в этом примере, TestHeader.json анализирует, но он завершается неудачно, когда дело доходит до Test.json. Если я включаю Child в Test.json в качестве определения вместо относительной ссылки, он также проходит.
У меня была похожая проблема с использованием JSchemaReaderSettings с BaseUri, установленным в корневую папку. В конце концов я понял, что он успешно разрешит первую ссылку, но затем BaseUri будет перемещен в местоположение Test.Json при попытке разрешить 2-ю ссылку.
Я сомневаюсь, что здесь проблема, так как Add () просто добавляет строку ссылки и поток в словарь для поиска. Мне кажется, что не должно иметь значения, что находится в URI распознавателя и URI схемы $ ref, если они совпадают.
Моя проблема всегда возникает, когда я пытаюсь разрешить ссылку на схему, на которую ссылается сама. Любой совет?