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
相关产品推荐
相关产品推荐

