VC中使用json库时的一个-1问题

近段时间,有时候程序会崩溃,郁闷。

这个问题好找,因为总是在进行月历搜索,即搜索哪些天有录像数据哪些天没有的时候崩溃的,当然不是一定崩溃,而是有时候会崩溃。

通过跟踪发现,在崩溃的时候,是月历搜索结果为空,远程返回了错误。

编译器是vs2010 c++,使用的json库如下图所示,头文件列表:

json库的头文件

源文件列表:

json库的源文件

正常的搜索结果为:

{“HD”:{“MSG”:5,”TASK”:99418},”PM”:{“RES”:20170320,”ERR”:0,”VEH”:1367}}

此时,经过如下的处理后,只获取 PM 的内容用于月历显示:

    Json::Value jsonReq;
    Json::Reader jsonReader;
    if (!jsonReader.parse(pMsgBuf, jsonReq))
    {
        MyLog("client parse json failed:%s.", pMsgBuf);
        return 0;
    }
    Json::FastWriter fastWriter;
    std::string jsonStr = fastWriter.write(jsonReq["PM"]);
    // jsonStr就是取得的 "PM"

取出的结果为 {“RES”:20170320,”ERR”:0,”VEH”:1367}

而当搜索结果为空时,如下所示:
{“HD”:{“MSG”:5,”TASK”:99418},”PM”:{“RES”:null,”ERR”:4294967295,”VEH”:1367}}
其中的 4294967295 实际为-1的无符号数,原本远程应该传过来-1,但是变成了这个大整数。
在经过以上的代码段取出的“PM”结果jsonStr值就变成了下面的样子:
{“RES”:null,”ERR”:4294967295.0,”VEH”:1367}}
这在后面程序解析这个串后获取“ERR”值时,原本以整数来取的,现在变成了浮点数,从而导致失败,由于没有加try … catch …,所以程序崩溃。

除了这种情况,这个json库对数据的处理太不灵活,数据类型稍有对不上,就throw一个异常出来

猜你喜欢

转载自blog.csdn.net/jszj/article/details/68065097