解析JSON时如何兼容处理int32与int64两种整数类型
修复方案
根因说明
你遇到的System.OverflowException是因为ToObject<int>()方法会严格校验数值范围,当JSON中的整数超出int32的取值范围(-2147483648 ~ 2147483647)时会直接抛出异常。
你之前尝试的先转long再强转int的写法无效,是因为如果实际数值真的超出int32范围,强制转换依然会触发溢出问题,也无法正确保留原始大数值。
可选调整方案
方案1(推荐):升级字段类型为long,同时兼容int32/int64数值
这是改动最小、兼容性最高的方案,long类型可以完整覆盖int32的取值范围,也能正常承接超出int32范围的大整数:
foreach (JToken resource in resources["responseData"]["resources"].ToList()) { string propName = resource.ToObject<JProperty>().Name; // 把amount类型从int改为long即可 long amount = resource.First.ToObject<long>(); if (resDef["id"]?.ToString() == propName) { // 后续业务逻辑如果需要用到int类型,可以先做范围判断再转换 if (amount >= int.MinValue && amount <= int.MaxValue) { int intAmount = (int)amount; // 执行需要int类型的逻辑 } else { // 自定义处理超出int32范围的场景 } } }
方案2:保留int类型,增加范围校验避免异常
如果业务逻辑强制要求amount必须为int类型,可以提前做范围校验,自定义处理溢出场景:
foreach (JToken resource in resources["responseData"]["resources"].ToList()) { string propName = resource.ToObject<JProperty>().Name; int amount; long longVal = resource.First.ToObject<long>(); if (longVal >= int.MinValue && longVal <= int.MaxValue) { amount = (int)longVal; } else { // 这里可以按业务需求处理,比如赋默认值、打日志告警等 amount = 0; } if (resDef["id"]?.ToString() == propName) { // 原有业务逻辑 } }
内容的提问来源于stack exchange,提问作者rcmpayne
相关产品推荐
相关产品推荐

