自定义类属性:将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
相关产品推荐
相关产品推荐

