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

如何让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]特性和手动验证:

  1. 修改类定义,给必填属性添加[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; }
}
  1. 反序列化后执行验证:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 04:45:32