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

自定义类属性:将API返回的字符串直接转为枚举的最佳实践

嘿,这个需求我太熟了!之前做API对接的时候也折腾过手动转换,后来发现直接利用序列化库的特性就能让字符串自动转成枚举,完全不用额外写转换代码,给你两种常用的方案:

方案1:针对System.Text.Json(.NET Core/.NET 5+ 默认序列化库)

直接给你的TestStatus枚举加上序列化转换器特性,再给每个枚举成员指定对应API返回的字符串就行:

using System.Text.Json.Serialization;

// 告诉序列化器把这个枚举当成字符串处理
[JsonConverter(typeof(JsonStringEnumConverter))]
public enum TestStatus
{
    // 如果API返回的是"passed",就映射到Passed枚举
    [JsonPropertyName("passed")]
    Passed,
    
    [JsonPropertyName("failed")]
    Failed,
    
    // 比如API返回下划线格式的"in_progress",映射到驼峰的InProgress
    [JsonPropertyName("in_progress")]
    InProgress
}

如果API返回的字符串和枚举成员名完全一致(比如API返回"Passed",枚举也是Passed),甚至可以省略[JsonPropertyName],只需要JsonStringEnumConverter就行。要是API返回的是驼峰格式,还可以用JsonStringEnumConverter(JsonNamingPolicy.CamelCase)来自动匹配,不用逐个加特性。

另外,如果担心API返回未知的状态值导致反序列化报错,可以加一个Unknown成员作为兜底:

[JsonConverter(typeof(JsonStringEnumConverter(unknownEnumValue: TestStatus.Unknown)))]
public enum TestStatus
{
    Unknown,
    [JsonPropertyName("passed")]
    Passed,
    [JsonPropertyName("failed")]
    Failed
}
方案2:针对Newtonsoft.Json(Json.NET,老项目常用)

如果你的项目用的是Newtonsoft.Json,写法类似但用的是另一个特性:

using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using System.Runtime.Serialization;

[JsonConverter(typeof(StringEnumConverter))]
public enum TestStatus
{
    [EnumMember(Value = "passed")]
    Passed,
    
    [EnumMember(Value = "failed")]
    Failed,
    
    [EnumMember(Value = "in_progress")]
    InProgress
}

Newtonsoft的StringEnumConverter默认支持大小写不敏感匹配,要是API返回的字符串和枚举名大小写不同但拼写一致,甚至不用加[EnumMember]。同样,遇到未知值的话,可以配置转换器或者加兜底成员。

这样配置完之后,你的API客户端在反序列化JSON响应时,会自动把返回的TestStatus字符串转换成对应的枚举成员,完全不用手动写转换逻辑啦!

内容的提问来源于stack exchange,提问作者BilalMr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:05:43