.NET 6中System.Text.Json反序列化带尾空格枚举值的解决方法
解决.NET 6中System.Text.Json反序列化带尾空格枚举的问题
针对第三方API返回带尾空格的枚举字符串导致反序列化失败的问题,最直接的解决方案是自定义一个支持自动修剪空格的枚举字符串转换器,继承默认的JsonStringEnumMemberConverter并扩展处理逻辑:
步骤1:实现自定义转换器
创建转换器类,在读取JSON字符串时先修剪首尾空格,再交给原转换器处理:
public class TrimmingJsonStringEnumMemberConverter : JsonStringEnumMemberConverter { public override object? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType == JsonTokenType.String) { // 修剪字符串首尾空格 var trimmedEnumValue = reader.GetString()?.Trim(); if (!string.IsNullOrEmpty(trimmedEnumValue)) { // 构造包含修剪后字符串的临时JSON,生成新的Utf8JsonReader using var jsonDoc = JsonDocument.Parse($"\"{trimmedEnumValue}\""); using var trimmedReader = new Utf8JsonReader(jsonDoc.RootElement.GetRawText().AsSpan(), options); return base.Read(ref trimmedReader, typeToConvert, options); } } // 非字符串类型或空值,沿用原逻辑处理 return base.Read(ref reader, typeToConvert, options); } }
步骤2:替换枚举的转换器
把枚举上的JsonConverter属性指向自定义转换器即可:
[JsonConverter(typeof(TrimmingJsonStringEnumMemberConverter))] public enum SomeEnum { [EnumMember(Value = "Some value 1")] Valu1 = 1, [EnumMember(Value = "Some value 2")] Valu2 = 2, }
全局生效方案(可选)
如果不想给每个枚举单独加属性,也可以在JsonSerializerOptions中注册自定义转换器,全局处理所有枚举的反序列化:
var serializerOptions = new JsonSerializerOptions(); serializerOptions.Converters.Add(new TrimmingJsonStringEnumMemberConverter()); // 反序列化时使用该选项 var model = JsonSerializer.Deserialize<YourTargetModel>(apiResponseJson, serializerOptions);
这个方案的核心是在反序列化枚举字符串的前置步骤中统一处理空格问题,既保留了JsonStringEnumMemberConverter对EnumMember特性的支持,又解决了第三方API返回数据的格式问题。
内容的提问来源于stack exchange,提问作者Hakuna
相关产品推荐
相关产品推荐

