JsonCpp读取较大数字出错问题
JsonCpp是c++中解析Json常用的解析库。在项目开发中,服务端如果用的是java的话都会是以JSON格式进行传输,客户端使用c++的话都会用到JsonCpp。看看下面这个问题:
json字串:{"@type":"Login","messageType":"Login","sendTime":1403575350411,"receivedTime":0,"loginId":"linzm","password":"123456","messageClientType":"WinForm"}
解析代码:
1 Json::Reader reader; 2 Json::Value root; 3 if (reader.parse(str, root)) 4 { 5 //获取里面内容 6 OutputDebugString(_T("STRING TO JSON \n")); 7 //std::string str1 = root["messageType"].asString(); 8 long long tmstamp = ((long long)(root["sendTime"].asUInt()))/1000; 9 10 WCHAR* wstr = NULL; 11 TimestampToLocalTime(&wstr,tmstamp); 12 }
结果发现第8行会出错,查了下错误原因, 原来SendTime是一个一毫秒为单位的时间戳,其值为1403575350411,这个值的大小远远超出了 unsigned int 或者 int的最大值,只能用INT64来表示, 但是看看Json::Value里面的函数只有asInt, asUint,没有取64位整数的函数,那怎么办呢?里面虽然没有64位的但是有一个asDouble,duoble的指数为11位,能表示的范围比Int64还大,所以上面的asUInt换成asDouble就可以了。
在写了这篇文章之后,和一位同事讨论了为什么JsonCpp里面为什么没有64位整数,他说的话让我感觉有点道理。Json起源于javascript,在js中数字的表示可能与高级语言中不一样, 如果一位数字32位表示不了那么js中应该一律都是用double表示, 所以说js中 大整数其实也是double, 这也就能解释为什么在jsoncpp中为什么没提供64为整数转化的方法。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步