.NET中如何校验JSON是否仅包含指定模型的属性子集?
.NET中校验JSON是否符合指定模型结构(仅允许子集属性)
要实现“JSON属性必须是.NET模型属性的子集(允许缺失,禁止新增未定义属性)”的校验,且支持泛型模型,可借助.NET主流JSON序列化库的内置配置来实现,无需手动反射遍历属性,以下是两种常用方案:
方案一:使用System.Text.Json(.NET Core 3.0+内置)
核心思路是禁用未知字段忽略,反序列化时若遇到模型未定义的属性,会直接抛出异常,以此判断JSON是否符合要求。
实现代码
using System.Text.Json; public static bool IsJsonConformsToModel<T>(string json) { try { var options = new JsonSerializerOptions { // 关键配置:遇到未知字段时不忽略,直接抛出异常 IgnoreUnknownFields = false }; // 尝试反序列化为目标泛型模型 JsonSerializer.Deserialize<T>(json, options); return true; } catch (JsonException) { // 捕获到异常说明JSON格式非法,或存在模型未定义的属性 return false; } }
使用示例
针对题目中的MyClass模型:
// 包含未知属性"Something",校验不通过 string s1 = "{\"Key1\":\"test\",\"Something\":\"invalid\"}"; bool result1 = IsJsonConformsToModel<MyClass>(s1); // 返回false // 缺失Key3属性,校验通过 string s2 = "{\"Key1\":\"test\",\"Key2\":[{\"Key4\":123}]}"; bool result2 = IsJsonConformsToModel<MyClass>(s2); // 返回true
方案二:使用Newtonsoft.Json(第三方库)
若项目仍在使用Newtonsoft.Json,可通过配置MissingMemberHandling.Error实现相同逻辑:
实现代码
using Newtonsoft.Json; public static bool IsJsonConformsToModel<T>(string json) { try { var settings = new JsonSerializerSettings { // 关键配置:遇到模型未定义的属性时抛出异常 MissingMemberHandling = MissingMemberHandling.Error }; JsonConvert.DeserializeObject<T>(json, settings); return true; } catch (JsonSerializationException) { // 存在未知属性时返回false return false; } catch (JsonReaderException) { // JSON格式本身不合法时返回false return false; } }
关键说明
- 泛型支持:上述方法均为泛型方法,可直接传入任意.NET模型类型(包括泛型模型),无需硬编码属性名称。
- 嵌套模型校验:序列化库会自动递归校验嵌套类型的属性(如示例中的
MyClass2),无需额外处理。 - 错误区分:若需要区分“JSON格式非法”和“存在未知属性”,可在catch块中捕获具体异常类型并分别处理。
内容的提问来源于stack exchange,提问作者Wouter Vandenputte
相关产品推荐
相关产品推荐

