我已将我的 JSON 模式拆分为多个文件,并根据需要以标准方式 ( "$ref": http://rootpath/otherfile.json#/definitions/link
) 引用它们。
JSON 文件是项目中的嵌入资源。这些rootpath
变化取决于它的部署位置。但是在生产中一切正常(发出请求,获得 JSON 响应作为模式,当针对模式 NJsonSchema 验证响应时,内部获取参考模式并提取完成验证所需的内容)
但是,当涉及到测试时,情况就不同了。响应很好,并且第一个模式被删除了。这rootpath
是这样的,一切都是相对的,http://testapi/
但实际上并不存在。因此,当 NJsonSchema 尝试获取参考架构时,它会查找类似 的http://testapi/otherfile.json#/definitions/link
内容,这显然失败了。
通过阅读本文,我想我想使用重载来获取JsonSchema4
允许我指定 JsonReferenceResolver 的对象,然后我可以在生产中使用默认值并注入我自己的进行测试,以便它在$ref
我的某个地方查找 s控制并且将存在。但我看不到任何关于此的文档或示例。
示例模式:
{ // root.json
"$schema": "http://json-schema.org/draft-07/schema#",
"$id": "@Model.Root/schemas/root.json",
"title": "Root",
"properties": {
"link": { "$ref": "@Model.Root/schemas/common.json#/definitions/link" }
},
"required": [ "link" ]
}
{ // common.json - different file to the above
"$schema": "http://json-schema.org/draft-07/schema#",
"$id": "@Model.Root/schemas/common.json",
"definitions": {
"link": {
"title": "Link",
"type": "object",
"properties": {
"rel": { "type": "string" },
"href": { "type": "string" }
},
"required": [ "rel", "href" ]
}
}
}
示例响应:
{
"schema": "http://testapi/schemas/root.json",
"link": { "rel": "self", "href": "http://testapi/root" }
};
验证码(C#):
using NJsonSchema;
using NJsonSchema.Validation;
...
JsonSchema4 schema = await JsonSchema4.FromJsonAsync(<contents of root.json file>);
string response = "{ ""link"": { ""rel"": ""self"", ""href"": ""http://testapi/root"" } }";
ICollection<ValidationError> errors = schema.Validate(response);
...