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

C#中JObject.Parse将数字识别为Int64而非UInt64的问题咨询

问题解答

是预期行为还是Bug?

这完全是预期行为,不是Bug。

Newtonsoft.Json(即JObject所属的JSON库)默认会把JSON中的整数优先解析为Int64(有符号64位整数),而Int64的最大值仅为9223372036854775807。你提到的数值11405418255883340000确实在UInt64(无符号64位整数,上限为18446744073709551615)的合法范围内,但受限于默认解析逻辑只优先适配有符号的Int64,所以触发报错是框架的正常设计。

最简单的解决方法

这里给出几个省心的实操方案:

  • 方案1:修改解析器配置适配大整数
    给JsonReader添加配置,让超出Int64范围的整数解析为Decimal(后续可按需转UInt64):

    var settings = new JsonReaderSettings
    {
        IntegerParseHandling = IntegerParseHandling.Decimal
    };
    
    using var reader = new JsonTextReader(new StringReader(str));
    reader.Settings = settings;
    var jobject = JObject.Load(reader);
    
    // 转成UInt64使用
    var seed = UInt64.Parse(jobject["seed"].ToString());
    
  • 方案2:将JSON数值改为字符串(无需数值运算时)
    如果seed仅用作标识、不需要参与数值计算,直接给JSON里的数值套上引号:

    "seed": "11405418255883340000"
    

    解析时直接读取字符串即可,完全规避范围问题。

  • 方案3:用强类型模型指定UInt64类型
    若有对应的实体类,直接把seed字段定义为UInt64,Json.NET会自动识别并正确解析:

    public class MyData
    {
        public UInt64 Seed { get; set; }
    }
    
    var data = JsonConvert.DeserializeObject<MyData>(str);
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 23:15:22