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

如何在不修改JSON及对应类的情况下解决‘Required property not found in json’错误?

解决Json.NET反序列化必填字段缺失的问题(无法修改类源码与JSON的场景)

针对你遇到的这个情况——DLL里的Thing类有个标记为Required.Always的IsBook属性,但JSON里没有这个字段,又不能改源码和JSON,我推荐用自定义ContractResolver来动态调整属性的必填规则,这是最直接有效的方案。

具体实现步骤:

  1. 自定义一个继承自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;
    }
}
  1. 在反序列化时,把这个自定义解析器传入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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:45:08