使用JsonConvert将JSON数字反序列化为Enum遇问题
JsonConvert反序列化数字到Enum的解决办法
先核对Enum定义和JSON数值的对应关系
别犯低级错误:确保Enum的数值和JSON里的数字完全匹配,比如你定义的Enum是:public enum OrderStatus { Pending = 0, Paid = 1, Shipped = 2 }如果JSON里传的是2,反序列化就该拿到Shipped,要是Enum里没对应数值,默认就会返回0(Pending),这是最常见的问题。
显式配置序列化设置
默认情况下Json.NET有时候会优先按字符串匹配Enum,导致数字反序列化出错,直接加个转换器配置:var settings = new JsonSerializerSettings { Converters = new List<JsonConverter> { new StringEnumConverter { AllowIntegerValues = true } }, MissingMemberHandling = MissingMemberHandling.Ignore }; var targetObj = JsonConvert.DeserializeObject<YourTargetClass>(jsonStr, settings);AllowIntegerValues = true就是告诉序列化器:数字也能直接映射Enum,不用非得转成字符串。构造函数传Enum的正确写法
如果你要在反序列化时通过构造函数注入Enum,得保证参数名和JSON键对应上,要是名字不一样,加个[JsonProperty]标注就行:public class Order { public OrderStatus Status { get; set; } // 参数名和JSON键一致的情况 public Order(OrderStatus status) { Status = status; } // 参数名和JSON键不一样的情况,加标注 public Order([JsonProperty("order_status")] OrderStatus status) { Status = status; } }复杂Enum场景用自定义转换器
要是你的Enum带[Flags]特性,或者有非连续的数值,写个自定义转换器更靠谱:public class OrderStatusConverter : JsonConverter<OrderStatus> { public override OrderStatus ReadJson(JsonReader reader, Type objectType, OrderStatus existingValue, bool hasExistingValue, JsonSerializer serializer) { if (reader.TokenType == JsonToken.Integer) { var numValue = Convert.ToInt32(reader.Value); if (Enum.IsDefined(typeof(OrderStatus), numValue)) { return (OrderStatus)numValue; } // 这里可以根据需求返回默认值或者抛异常 throw new JsonSerializationException($"无效的OrderStatus值:{numValue}"); } // 兼容字符串形式的Enum输入 return Enum.Parse<OrderStatus>(reader.Value.ToString(), ignoreCase: true); } public override void WriteJson(JsonWriter writer, OrderStatus value, JsonSerializer serializer) { writer.WriteValue((int)value); } }用的时候把这个转换器加到settings里就行:
var settings = new JsonSerializerSettings { Converters = new List<JsonConverter> { new OrderStatusConverter() } };
内容的提问来源于stack exchange,提问作者stackMeUp
相关产品推荐
相关产品推荐

