1. 问题现象与背景解析
最近在Unity项目中使用LitJson解析数据时,遇到了一个典型的类型转换异常:"JsonException: Can't assign value 'xxx' (type System.Double) to type System.Int64"。这个错误表面上看是简单的类型不匹配,但背后反映了LitJson库在类型系统处理上的一个重要特性。
LitJson作为一个轻量级的JSON解析库,其设计初衷是为了在Unity等环境中提供快速简便的JSON处理能力。但正是这种"轻量级"的设计理念,导致它在类型转换方面不如Newtonsoft.Json等全功能库那么智能。具体到我们的案例,当JSON数据中包含浮点数(如123.45),而C#模型期望的是长整型(long)时,LitJson不会自动执行这种可能丢失精度的转换。
注意:这种设计实际上是合理的保守策略。自动将double转为long可能导致不可预期的精度丢失,库开发者选择让使用者显式声明这种转换,以避免隐藏的bug。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 类型系统差异深度解析
2.1 JSON与C#的类型映射
JSON规范定义的基本数据类型包括:
- Number(整数或浮点数)
- String
- Boolean
- Array
- Object
- null
而C#的数字类型则丰富得多,包括:
- 整型:int, long, short, byte等
- 浮点型:float, double, decimal
当JSON中的数字没有小数点时,LitJson会优先尝试解析为C#的整型(如int/long);当有小数点时,则解析为double。问题就出在当JSON数字实际上是整数(如"123.0"),但以浮点形式表示时,LitJson会严格保持其double类型,不会自动转为整型。
2.2 LitJson的转换规则
通过分析LitJson源码可以发现,其类型转换遵循以下优先级:
- 完全匹配类型(如JSON string -> C# string)
- 隐式可转换类型(如JSON int -> C# long)
- 注册的自定义转换器
- 抛出JsonException
我们的案例属于第3种情况 - 需要显式注册转换器才能完成的转换。
