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

解析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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 04:54:03