使用NewtonSoft JsonSchema解析Draft-07 Schema时遇数组转布尔值异常
问题根因分析
你碰到的这个情况挺常见的:在线验证工具能完美处理你的Draft-07 Schema,但本地用JsonSchema.Parse()就抛出ArgumentException说“不能把数组转成布尔值”。主要原因大概率是Newtonsoft.Json.Schema版本对Draft-07的支持不到位,或者本地Schema文件可能存在隐形的格式问题。
先核对下你用的包版本——旧版的Newtonsoft.Json.Schema对Draft-07的兼容做得不够好,有些关键字的解析逻辑会出现类型转换错误。另外也得确认本地的schema.txt和你贴出来的Schema完全一致,有时候文件编码、多余的空格换行也可能搞出问题,但从你给的Schema内容看,结构是完全符合Draft-07规范的。
一步步解决问题
1. 先把包更到最新版
Newtonsoft.Json.Schema后续版本补全了Draft-07的支持,所以第一步务必升级到最新稳定版:
- 用NuGet包管理器搜索
Newtonsoft.Json.Schema,直接点更新; - 或者在Package Manager Console里敲:
Install-Package Newtonsoft.Json.Schema -Version latest
2. 解析时显式指定Draft版本
有时候解析器自动推断版本会出错,咱们直接在解析时指定用Draft-07:
string schemaJson = File.ReadAllText(@"c:\temp\schema.txt"); var settings = new JsonSchemaSettings { SchemaVersion = SchemaVersion.Draft7 }; JsonSchema schema = JsonSchema.Parse(schemaJson, settings);
3. 检查本地Schema文件的完整性
确保schema.txt的内容和你提供的Draft-07 Schema一字不差:
- 看看有没有多打逗号、缺括号的情况;
- 文件编码选UTF-8(无BOM),避免解析时出现字符乱码干扰。
4. 测试验证逻辑是否正常
解析成功后,你可以用这段代码测试下,和在线工具的结果对比:
// 你的无效JSON示例 string invalidJson = @"{ ""checked"": ""false"", ""dimensions"": { ""width"": 5, ""height"": 10 }, ""id"": 1, ""name"": ""A green door"", ""price"": 12.5, ""tags"": [ ""home"", ""green"" ] }"; JObject json = JObject.Parse(invalidJson); IList<string> errors = schema.Validate(json); // 输出验证错误 foreach (string error in errors) { Console.WriteLine(error); }
正常情况下,这段代码会输出"checked" must be a boolean之类的错误,和在线工具的结果一致。
为啥在线工具没问题?
像你用的这类在线验证工具,大多用的是Ajv这类更新的Schema验证库,对Draft-07的支持更全面。而旧版Newtonsoft.Json.Schema在处理Draft-07的某些关键字时存在bug,升级包之后这类类型转换的异常就会消失。
内容的提问来源于stack exchange,提问作者Peter Morris

