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

JsonSerializer.Deserialize无法转换数值:如何修复反序列化问题

修复System.Text.Json反序列化Int32溢出错误

错误原因

接口返回的expires值1676226606506是一个64位整数,而你的LoginResponse类中Expires字段定义为int(即Int32)。Int32的取值范围是-2147483648到2147483647,该数值远超Int32上限,导致反序列化时抛出类型转换异常。


方案一:修改字段类型为long(推荐)

直接将LoginResponse类中的Expires字段类型改为long(或Int64),即可容纳接口返回的大数值:

class LoginResponse
{
  public string Token { get; set; }
  public long Expires { get; set; } // 替换int为long
}

方案二:自定义转换器(需保留Int32类型时)

若业务必须使用Int32类型,且确认expires值可安全转换为Int32(比如仅取时间戳有效部分),可自定义JSON转换器处理类型转换:

public class Int64ToInt32Converter : JsonConverter<int>
{
    public override int Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        if (reader.TokenType == JsonTokenType.Number)
        {
            var longValue = reader.GetInt64();
            if (longValue >= int.MinValue && longValue <= int.MaxValue)
            {
                return (int)longValue;
            }
            // 超出范围时可抛出自定义异常或返回默认值
            throw new JsonException("Expires值超出Int32范围");
        }
        throw new JsonException("Expires字段应为数字类型");
    }

    public override void Write(Utf8JsonWriter writer, int value, JsonSerializerOptions options)
    {
        writer.WriteNumberValue(value);
    }
}

反序列化时启用该转换器:

var options = new JsonSerializerOptions();
options.Converters.Add(new Int64ToInt32Converter());
var body = JsonSerializer.Deserialize<LoginResponse>(bodyString, options);

注意:方案二存在数据丢失风险,仅当确认expires值不会超出Int32范围时使用,优先选择方案一。

内容的提问来源于stack exchange,提问作者1baz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 12:20:50