You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:40:44