【问题标题】:Using Json.Net Schema Validation with Multiple Levels of Sub-Schema References将 Json.Net 模式验证与多级子模式引用一起使用
【发布时间】: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


【解决方案1】:

好的,我知道我做错了什么。根据json-schema.org

$id 属性是一个 URI,有两个用途: 1) 它声明了模式的唯一标识符。 2) 它声明了一个基础 URI,$ref URI 是根据它解析的。

因为我的子模式 (Test.json) 中有一个 $id 属性,所以它在解析时将基本 URI 更改为该位置。这导致子架构中的下一个引用不正确。

当我在除顶级架构之外的所有架构中删除 $id 属性时,所有架构现在都可以正确解析。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-06
    • 2023-03-14
    • 1970-01-01
    • 2018-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-11
    相关资源
    最近更新 更多