同一文件中的多个模式
本文关键字:模式 文件 | 更新日期: 2023-09-27 17:50:58
我有两个JSON模式,它们需要共享相当多的公共定义。我希望通过引用使用一组外部文件来完成此操作,但我似乎无法获得Json的最新版本。. NET(6.0.1)加载外部引用。它可以使用公共解析器加载外部加载的模式,但它不能处理"someOtherSchema#somePath/to/definition"形式的URI。它尝试查找具有该id的模式,完全忽略中间的"#"。这是Json Schema草案3 (Json版本)的有效URI引用。. NET应该支持).
所以我的工作是使用模式的"items"集合将两个模式放在同一个文件中。所以我要写这样的内容:
{
"id": "ourSchema",
"$schema": "http://json-schema.org/draft-03/schema",
"items": [
{
"title": "Schema1",
"type": "object",
...
},
{
"title": "Schema2",
"type": "object",
...
}
]
...
这可以正常工作并正确解析,子模式找到正确的$ref定义并加载所有内容。但是,当我尝试使用项目集合中的一个模式进行验证时,一切都通过了,即使它显然是无效的。代码看起来像这样:
var reader = new JsonValidatingReader(new JsonTextReader(new StreamReader(stream))) {Schema = mySchema.Items[0]};
reader.ValidationEventHandler += (o, e) => errors.Add(e.Message);
_object = JObject.Load(reader);
我用错了这个功能吗?这是Json.NET的一个bug吗?在这一点上,我有点想使用Json。. NET正确地尊重外部引用并提交拉取请求,因为这是问题的真正解决方案。我只是想让这段代码正常工作,这样我就可以同时转移到其他事情上。
我把问题弄明白了。模式正在做它应该做的事情,但是Json。. NET目前不支持"oneOf",这是一个草案4的构造。这就是问题所在,因为我使用的是"oneOf"。它不会加载模式失败,但它会忽略"oneOf"下面的所有内容。