如何让ServiceStack JSON反序列化时缺失必填属性抛出异常?
用ServiceStack实现JSON反序列化必填属性校验
问题原因
ServiceStack默认的JSON反序列化是宽松模式,即便你给属性标记了[DataMember(IsRequired = true)]或[Required],也不会自动因为缺失属性抛出异常,需要手动开启严格校验或使用验证机制。
解决方案1:开启全局严格反序列化模式
通过设置JsConfig的全局配置,让反序列化时只要JSON缺失目标类型的DataMember属性就抛出异常:
// 全局配置(建议在应用启动时设置一次) JsConfig.ThrowOnMissingProperties = true; // 执行反序列化 var settings = settingsString.FromJson<Settings>();
如果只需要针对单次反序列化生效,可使用带自定义配置的重载方法:
var config = new JsonSerializerConfig { ThrowOnMissingProperties = true }; var settings = JsonSerializer.DeserializeFromString<Settings>(settingsString, config);
解决方案2:使用ServiceStack数据验证特性
若要精准控制哪些属性必填,可结合[Required]特性和手动验证:
- 修改类定义,给必填属性添加
[ServiceStack.DataAnnotations.Required]:
[DataContract] public record Settings { [DataMember, Required] public int Property1 { get; init; } [DataMember, Required] public string Property2 { get; init; } [DataMember, Required] public MyType Property3 { get; init; } } [DataContract] public record MyType { [DataMember, Required] public int ChildProperty1 { get; init; } [DataMember, Required] public string ChildProperty2 { get; init; } }
- 反序列化后执行验证:
var settings = settingsString.FromJson<Settings>(); var validator = new ValidationResult(); settings.Validate(validator); if (!validator.IsValid) { throw new ValidationException(validator.ErrorMessage); }
补充说明
[DataMember(IsRequired = true)]主要针对WCF风格的DataContract序列化(如SOAP),对JSON反序列化默认不生效,需配合ThrowOnMissingProperties配置才能触发校验。- 无需更换反序列化器,ServiceStack本身已支持必填属性校验需求。
内容的提问来源于stack exchange,提问作者LorneCash
相关产品推荐
相关产品推荐

