JObject无法解析非对象JSON字符串,如何完成JSON Schema校验?
解决JObject.Parse非对象JSON时的异常问题
看起来你遇到的核心问题是:当输入的JSON不是对象类型(比如那种纯字符串的错误提示)时,JObject.Parse直接抛出异常,导致你没法完成Schema校验的判断。咱们可以通过调整解析逻辑来解决这个问题,让你的方法能优雅处理所有非预期的JSON格式。
改进思路
首先,JObject.Parse只认JSON对象,而实际场景中可能会收到字符串、null、数组等其他类型的JSON,甚至是完全无效的JSON串。所以我们需要:
- 先安全解析所有JSON类型,而不是仅局限于对象
- 先判断解析结果的类型是否符合Schema要求(你的Schema定义的是object)
- 处理解析失败的情况(比如格式完全错误的JSON)
改进后的代码实现
public static class JsonHelper { internal const string UserResetDataScheme = @"{ 'title' : 'UserResetDataModel', 'type' : 'object', 'properties': { 'Role' : {'type' : 'integer'}, 'Email' : {'type' : 'string'} }, required: [ 'Role', 'Email'] }"; internal static T TryParseJson<T>(this string json, string schema) where T : new() { // 先处理空输入的情况 if (string.IsNullOrWhiteSpace(json)) return default(T); JToken jsonToken; try { // 用JToken.Parse替代JObject.Parse,它能处理所有JSON元素类型 jsonToken = JToken.Parse(json); } catch (JsonReaderException) { // 捕获完全无效的JSON格式,直接返回默认值 return default(T); } // 先判断解析后的JSON是不是对象类型,不是的话直接返回默认(相当于校验不通过) if (jsonToken.Type != JTokenType.Object) return default(T); var jObject = (JObject)jsonToken; var parsedSchema = JSchema.Parse(schema); // 走原有的Schema校验逻辑 return jObject.IsValid(parsedSchema) ? JsonConvert.DeserializeObject<T>(json) : default(T); } }
关键调整说明
- 替换JObject.Parse为JToken.Parse:JToken是Newtonsoft.Json中所有JSON元素的基类,不管输入是字符串、数字、数组还是对象,都能正常解析,不会直接抛出异常。
- 增加类型检查:因为你的Schema定义的是
object类型,所以如果解析后的JSON不是Object(比如你遇到的纯字符串错误提示),直接判定为不符合要求,返回default(T)。 - 空输入预处理:提前过滤空或空白的JSON字符串,避免不必要的解析操作。
- 捕获解析异常:对于完全无效的JSON(比如乱码、不闭合的括号),捕获
JsonReaderException并返回默认值,保证方法不会崩溃。
这样修改后,当你输入类似"\"User sent null or empty data\""的字符串时,方法会优雅地返回default(T),达到你想要的“校验不通过”的效果;而符合Schema的对象类型JSON,依然能正常完成校验和反序列化。
内容的提问来源于stack exchange,提问作者Andrey
相关产品推荐
相关产品推荐

