1. 错误现象与背景解析
最近在调试一个C#项目时遇到了这个报错:"JsonException: Can't assign value 'xxx'(type System.Double) to type System.Int64 at LitJson.JsonMapper"。这个错误发生在使用LitJson库进行JSON反序列化时,当JSON数据中包含浮点数但C#模型定义为long类型时就会触发。比如JSON中是{"price":19.99}但C#类里对应属性是public long price {get; set;}。
这种情况在实际开发中很常见,特别是在处理第三方API返回的数据时。很多API出于灵活性考虑会返回带小数点的数值,即使逻辑上这个字段应该是整数。比如电商系统中的价格字段,虽然显示时是两位小数,但存储时可能需要转换为以分为单位的整型。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. LitJson的类型转换机制
2.1 LitJson的基本工作原理
LitJson是一个轻量级的C# JSON库,它的JsonMapper类负责在JSON字符串和C#对象之间进行转换。当遇到数值类型时,它会尝试以下转换规则:
- 如果JSON中的数字没有小数点(如
123),会优先尝试转换为int/long - 如果带有小数点(如
123.45),则转换为double - 当目标属性类型与JSON值类型不匹配时,尝试隐式转换
问题就出在这个隐式转换上 - C#中double到long的转换不是隐式的,需要显式类型转换。
2.2 类型转换的边界情况
LitJson处理数值类型时有一些特殊行为需要注意:
- 对于整数范围的浮点数(如
123.0),仍然保持double类型 - 超出long范围的整数(如
1e20)会保持为double - decimal类型有独立的处理逻辑
3. 解决方案与代码实现
3.1 方案一:修改模型定义
最直接的解决方案是调整C#模型定义,将属性类型改为double:
csharp复制public class Product {
public double price {get; set;} // 改为double类型
}
但这样会带来一些问题:
- 业务逻辑中可能需要大量类型转换
