ASP.NET Core 6.0反序列化时忽略可选属性避免报错的方法
你的问题根源在于Template属性上的Newtonsoft.Json注解存在笔误+规则冲突,同时混用了System.Text.Json和Newtonsoft.Json的注解,导致反序列化逻辑异常。以下是具体修复方案:
1. 修正Template属性的错误注解
你当前的Template属性注解存在明显错误:
[JsonPropertyName("Template")] [JsonProperty("FileName", Required = Required.DisallowNull, NullValueHandling = NullValueHandling.Ignore)] public string Template { get; set; }
这里的[JsonProperty("FileName")]是笔误——把JSON字段名写成了FileName,还设置了Required = Required.DisallowNull,这会让Newtonsoft序列化器错误地认为JSON中必须存在FileName字段且不能为null,和你实际要处理的Template字段完全冲突,这就是报错的核心原因。
针对不同序列化库的修复方式:
情况A:使用ASP.NET Core 6默认的System.Text.Json
ASP.NET Core 6默认用System.Text.Json处理JSON序列化,此时只保留System.Text.Json的注解即可。引用类型(如string)默认允许为null,当JSON中不存在对应字段时会自动设为null,不会触发必填报错:
[JsonPropertyName("Template")] public string Template { get; set; }
如果需要忽略null值的序列化输出,可以补充:
[JsonPropertyName("Template")] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] public string Template { get; set; }
情况B:项目配置了使用Newtonsoft.Json(如添加了AddNewtonsoftJson())
修正Newtonsoft的注解,将JSON字段名改为Template,并移除强制必填的设置(默认Required.Default即为非必填):
[JsonPropertyName("Template")] // 兼容System.Text.Json(如果项目同时混用) [JsonProperty("Template", NullValueHandling = NullValueHandling.Ignore)] public string Template { get; set; }
如果需要明确声明允许字段缺失,也可以显式指定:
[JsonProperty("Template", Required = Required.Default, NullValueHandling = NullValueHandling.Ignore)]
2. 统一序列化库注解
建议尽量避免同时混用System.Text.Json([JsonPropertyName])和Newtonsoft.Json([JsonProperty])的注解,根据项目实际使用的序列化库,只保留对应注解即可,减少不必要的逻辑冲突。
额外检查
如果你的项目全局配置了强制必填的序列化规则(比如System.Text.Json设置了全局必填),只需确保Template属性没有添加[JsonRequired]注解即可,引用类型默认是可选的。
内容的提问来源于stack exchange,提问作者Евгений

