【发布时间】:2019-05-07 21:03:58
【问题描述】:
我有一个具有相对文件引用的 Json Schema,如下所示:
{
"$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 Schema Validation 时出现了我的问题。目前,我们正在将 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"));
当我使用此解析器从 JsonReader 加载 JSchema 时,只要没有第二个子模式引用,它就可以很好地工作。事实上,在这个例子中,TestHeader.json 被解析了,但是当涉及到 Test.json 时它就失败了。如果我将 Child 作为定义而不是相对引用包含在 Test.json 中,它也会通过。
我在使用 JSchemaReaderSettings 并将 BaseUri 设置为根文件夹时遇到了类似的问题。我最终意识到它会成功解析第一个引用,但是在尝试解析第二个引用时,BaseUri 将被移动到 Test.Json 位置。 我怀疑这是这里的问题,因为 Add() 只是将引用字符串和流添加到字典中进行查找。在我看来,解析器 URI 和模式 $ref URI 中的内容无关紧要,只要它们匹配即可。
当我尝试解析本身引用的架构的引用时,总是会出现我的问题。有什么建议吗?
【问题讨论】:
-
您是否不愿意尝试使用不同的 $id 和 $ref 引用 URI?如果是这样,我无法帮助你。
-
我愿意尝试任何事情。你有什么建议?
-
可以肯定的是,在您的示例代码中,您在添加新解析器架构时似乎缺少双引号...
标签: c# json.net jsonschema