Json.NET Schema的IsValid方法类型不匹配时仍返回true的问题
JSON Schema验证类型不匹配却返回True?问题排查与解决
看起来你遇到了JSON Schema验证里的一个常见小坑,我来帮你捋捋问题出在哪,以及怎么解决:
1. 首先排查JSON Schema的语法问题
你给出的Schema片段用了单引号',但JSON标准严格要求用双引号",Newtonsoft.Json.Schema对Schema的解析是遵循JSON规范的,单引号会直接导致Schema解析失败——相当于没有任何有效的约束,所以IsValid自然会返回true。
举个例子,你当前的Schema开头:
{ 'title' : '...'
这是不符合JSON语法的,必须改成:
{ "title": "Hero Schema", "type": "object", "properties": { "Name": { "type": "integer" }, "BattleRank": { "type": "integer" } }, "required": ["Name", "BattleRank"] }
2. 确认验证逻辑的实现是否正确
你没贴出完整的IsValid调用代码,但大概率是没有正确加载Schema并执行验证。给你一个完整的正确验证流程参考:
// 1. 定义符合JSON规范的Schema(全部用双引号) string validSchemaJson = @"{ ""title"": ""Hero Schema"", ""type"": ""object"", ""properties"": { ""Name"": { ""type"": ""integer"" }, ""BattleRank"": { ""type"": ""integer"" } }, ""required"": [""Name"", ""BattleRank""] }"; // 2. 解析Schema JsonSchema schema = JsonSchema.Parse(validSchemaJson); // 3. 生成待验证的JSON对象 var hero = new Hero { Name = "Egid Beyond Meta", BattleRank = 5000 }; string jsonOutput = JsonConvert.SerializeObject(hero); JObject deserializedHero = JObject.Parse(jsonOutput); // 4. 执行验证 bool isValid = deserializedHero.IsValid(schema); // 此时isValid会返回false,符合你的预期
3. 其他可能的排查点
- 检查Newtonsoft.Json和Newtonsoft.Json.Schema的版本是否匹配:版本不兼容可能导致验证逻辑异常,尽量使用同系列的稳定版本。
- 确认是否设置了宽松的验证选项:比如
ValidationSettings里的AllowAdditionalProperties等,但默认配置下不会导致类型不匹配却通过验证。
总结
最可能的原因就是你的Schema用了单引号导致解析失败,验证约束根本没生效。把所有单引号换成双引号,再按照正确的流程执行验证,就能得到你预期的false结果啦。
内容的提问来源于stack exchange,提问作者Riddlah
相关产品推荐
相关产品推荐

