System.Text.Json报错无法将JSON值转换为Enum,如何正确反序列化枚举字符串?
这个报错是因为System.Text.Json默认仅支持将数字值转换为枚举类型,而你的OData接口返回的是枚举的字符串名称,所以需要配置字符串枚举转换器来支持这种场景,有两种常用实现方案:
方案1:在反序列化时临时指定配置(仅作用于当前反序列化逻辑)
你只需要在调用JsonSerializer.Deserialize时传入包含枚举字符串转换器的配置即可,修改你的反序列化代码:
if (response.IsSuccessStatusCode) { var body = await response.Content.ReadAsStringAsync(); // 新增序列化配置 var options = new JsonSerializerOptions { // 注册字符串转枚举转换器 Converters = { new JsonStringEnumConverter() }, // 可选:开启属性名不区分大小写匹配,避免属性名大小写不一致导致反序列化失败 PropertyNameCaseInsensitive = true }; var oDataResponse = JsonSerializer.Deserialize<OrgUnitsResponse>(body, options); return oDataResponse; }
如果你的接口返回的枚举字符串存在大小写和枚举定义不匹配的情况,可以配置转换器忽略大小写:
// 第一个参数可以指定命名策略,比如驼峰命名就传JsonNamingPolicy.CamelCase,不需要的话传null即可 // 第二个参数设置为true即允许大小写不匹配 Converters = { new JsonStringEnumConverter(null, true) }
方案2:给枚举类加转换器特性(全局作用于该枚举的所有反序列化场景)
如果你希望所有用到Status和OperationMode枚举的地方都默认支持字符串反序列化,可以直接在枚举定义上加上JsonConverter特性:
using System.Text.Json.Serialization; [JsonConverter(typeof(JsonStringEnumConverter))] public enum OperationMode { Inherited = 0, Normal = 1, Test = 2 } [JsonConverter(typeof(JsonStringEnumConverter))] public enum Status { Inherited = 0, Active = 1, Inactive = 2 }
用这个方案的话,原来的反序列化代码不需要做任何修改,直接调用JsonSerializer.Deserialize<OrgUnitsResponse>(body)就可以正常转换。
内容的提问来源于stack exchange,提问作者Stefan Jaspers
相关产品推荐
相关产品推荐

