swagger-spec存储库提供了一个描述有效swagger 2.0 API定义的JSON-模式。我想使用这个模式来验证给定的API定义文件是否有效,然后再尝试解释它。我使用以下代码使用Json.NET加载架构:
JsonSchema swaggerApiSchema;
using (var textReader = new JsonTextReader(new StreamReader(@"C:pathtoschema.json")))
{
swaggerApiSchema = JsonSchema.Read(textReader);
}
这引发ArgumentException报告"无法将数组转换为布尔值"。
架构文件是否有问题,这是Json.NET的错误,还是我只是做错了什么?
根据文档,JSON.NET实现了JSON Schema Draft 3。点击此处了解更多信息。但是您发布的Swagger模式是根据JSONSchemaDraft4创建的。JSON模式的草案3和草案4之间的一个区别是必需的属性,在JSON模式草案3中,它是属性中子模式的一个属性。在JSON Schema Draft 4中,一级关键字扮演着相同的角色,并有一个字符串数组作为参数。
JSON模式草案3示例:
{
"properties": {
"Id": {
"required": true,
"type": "integer"
},
"FirstName": {
"required": true,
"type": "string",
},
"LastName": {
"required": true,
"type": "string
}
}
}
JSON模式草案4示例:
{
"properties": {
"Id": {
"type": "integer"
},
"FirstName": {
"type": "string"
},
"LastName": {
"type": "string"
}
},
"required": [ "Id", "FirstName", "LastName" ]
}
请注意这两种模式在定义所需属性方面的差异。这就是为什么你会得到一个错误:"无法将数组转换为布尔值。"。
这里是Swagger JSON模式中第一次出现所需属性,这导致了错误:
"required": [ "swagger", "info", "paths" ]
我建议使用实现JSONSchemaDraft4的解析器进行验证。