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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 13:17:02