如何在C#中用NJsonSchema/Manatee.Json验证JSON与JSON Schema
用NJsonSchema验证REST响应与JSON Schema一致性的实现方案
我之前在契约测试场景里也碰到过类似的问题,下面给你一个完整可运行的实现示例,帮你搞定这个验证需求。
1. 准备工作:安装NJsonSchema包
首先确保你的项目里安装了NJsonSchema的NuGet包,可以通过.NET CLI或者Package Manager控制台完成安装:
# .NET CLI安装命令 dotnet add package NJsonSchema
2. 核心实现步骤
步骤1:修正JSON Schema格式
注意:JSON规范要求使用双引号,先把你提供的Schema转换成标准JSON格式(同时把required字段统一移到根节点,更符合JSON Schema规范):
{ "type": "object", "properties": { "remaining": { "type": "integer" }, "shuffled": { "type": "boolean" }, "success": { "type": "boolean" }, "deck_id": { "type": "string" } }, "required": ["remaining", "shuffled", "success", "deck_id"] }
你可以把这段内容保存为本地文件(比如deck.schema.json),或者直接用字符串形式加载。
步骤2:编写完整验证代码
下面是C#的完整示例,包含从REST接口获取响应、加载Schema、执行验证的全流程:
using System; using System.Net.Http; using System.Threading.Tasks; using NJsonSchema; using NJsonSchema.Validation; namespace ContractTestingDemo { class Program { static async Task Main(string[] args) { try { // 1. 加载本地JSON Schema文件(也可以直接用字符串加载) var schemaPath = @"C:\YourProject\deck.schema.json"; // 替换成你的Schema文件路径 var schema = await JsonSchema.FromFileAsync(schemaPath); // 2. 从REST端点获取待验证的JSON响应 using var httpClient = new HttpClient(); var apiResponse = await httpClient.GetStringAsync("https://your-api-endpoint.com/deck"); // 替换成你的实际API地址 // 如果你想直接测试示例JSON,可以替换成下面这行 // var apiResponse = @"{""remaining"": 52, ""shuffled"": true, ""success"": true, ""deck_id"": ""b5wr0nr5rvk4""}"; // 3. 执行Schema验证 var validationErrors = schema.Validate(apiResponse); // 4. 处理验证结果 if (validationErrors.Count == 0) { Console.WriteLine("✅ JSON响应与Schema完全匹配,验证通过!"); } else { Console.WriteLine("❌ 验证失败,错误详情:"); foreach (var error in validationErrors) { Console.WriteLine($"- 字段[{error.Property}]:{error.Message}"); } } } catch (Exception ex) { Console.WriteLine($"⚠️ 执行过程中出现异常:{ex.Message}"); } } } }
3. 关键注意事项
- JSON格式正确性:必须确保Schema和待验证的JSON都是标准JSON(使用双引号,不能用单引号),否则NJsonSchema会解析失败。
- Schema加载方式:除了从文件加载,也可以直接从字符串加载Schema,比如:
var schemaJson = @"{""type"":""object"", ""properties"": {...}}"; // 标准JSON字符串 var schema = await JsonSchema.FromJsonAsync(schemaJson); - 错误排查:如果验证失败,
validationErrors集合会返回具体的错误位置和原因,比如字段类型不匹配、必填字段缺失等,方便快速定位问题。
4. 测试示例JSON
用你提供的测试JSON运行上述代码,会输出✅ JSON响应与Schema完全匹配,验证通过!,因为示例JSON完全符合Schema的要求。
内容的提问来源于stack exchange,提问作者Dileep17
相关产品推荐
相关产品推荐

