如何在不修改JSON及对应类的情况下解决‘Required property not found in json’错误?
解决Json.NET反序列化必填字段缺失的问题(无法修改类源码与JSON的场景)
针对你遇到的这个情况——DLL里的Thing类有个标记为Required.Always的IsBook属性,但JSON里没有这个字段,又不能改源码和JSON,我推荐用自定义ContractResolver来动态调整属性的必填规则,这是最直接有效的方案。
具体实现步骤:
- 自定义一个继承自
DefaultContractResolver的解析器,重写CreateProperty方法,针对性取消IsBook属性的必填要求:
public class IgnoreRequiredThingResolver : DefaultContractResolver { protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) { JsonProperty property = base.CreateProperty(member, memberSerialization); // 只针对Thing类的IsBook属性修改规则 if (member.DeclaringType == typeof(Thing) && member.Name == nameof(Thing.IsBook)) { // 将必填要求改为默认(不强制检查) property.Required = Required.Default; } return property; } }
- 在反序列化时,把这个自定义解析器传入
JsonSerializerSettings:
// 配置序列化设置 var jsonSettings = new JsonSerializerSettings { ContractResolver = new IgnoreRequiredThingResolver() }; // 执行反序列化,不会再抛出必填字段缺失的错误 Thing result = JsonConvert.DeserializeObject<Thing>(yourJsonString, jsonSettings);
原理说明:
Json.NET的ContractResolver负责生成类的序列化/反序列化契约,我们通过重写CreateProperty方法,可以在运行时动态修改特定属性的规则,不需要改动原类的源码,也不用修改JSON内容,完美适配你的限制条件。如果之后需要忽略其他属性的必填要求,只需要在CreateProperty方法里添加对应的判断逻辑即可,扩展性很强。
内容的提问来源于stack exchange,提问作者Ramin Bateni Parvar
相关产品推荐
相关产品推荐

