Использование проверки схемы Json.Net с несколькими уровнями ссылок на подсхемы - PullRequest
0 голосов
/ 08 мая 2019

У меня есть схема 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, если они совпадают.

Моя проблема всегда возникает, когда я пытаюсь разрешить ссылку на схему, на которую ссылается сама. Любой совет?

1 Ответ

1 голос
/ 08 мая 2019

Хорошо, я понял, что я делаю не так. По данным json-schema.org :

Свойство $ id - это URI, который служит двум целям: 1) Он объявляет уникальный идентификатор для схемы. 2) Он объявляет базовый URI, для которого разрешаются URI $ ref.

Поскольку у меня было свойство $ id в моих подсхемах (Test.json), оно меняло базовый URI на это место при его анализе. Это привело к тому, что следующая ссылка в подсхеме была неправильной.

Когда я удаляю свойство $ id во всех схемах, кроме схемы верхнего уровня, все схемы теперь анализируются правильно.

...