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

