C++ json库jsoncpp 吐槽

 

Explain

     最近在做游戏接入SDK时用到C++的json库jsoncppjsoncpp 是一款优秀的json库,但恶心的一点是它采用Assert作为错误处理方法,而assert在linux下通过调用 abort 来终止程序运行,对于服务器而言将会收到SIGABRT,崩溃打出core,这对于服务器而言是致命的,下面总结了几种 Assertion `type_ == nullValue || type_ == object Value' failed的情况。

    1. json字符串不合法
       1: Json::Reader *pJsonParser = new Json::Reader();
       2: string strJson = "1111 {}";        //不合法json
       3:  
       4: Json::Value tempVal;
       5:  
       6: if(!pJsonParser->parse(strJson, tempVal))
       7: {
       
       8:     cout << "parse error" << endl;
       9:     return -1;
      10: }
      11: string name = tempVal["name"].asString();
    由于Jsoncpp解析非法json时,会自动容错成字符类型。对字符类型取下标时,会触发assert终止进程。
    解决方法:启用严格模式,让非法的json解析时直接返回false,不自动容错。这样,在调用parse的时候就会返回false。
       1: Json::Reader *pJsonParser = new Json::Reader(Json::Features::strictMode());

    2.解析串为json数组

       1: Json::Reader *pJsonParser = new Json::Reader();
       2: string strJson = "{\"name\":\"tom\",\"sex\":\"男\",\"age\":\"24\",\"friends\":[{\"name\":\"chen\',\'sex\':\'男\"},{\"name\":\"li\",\"sex\":\"女\"}]}";
       3:  
       4: Json::Value tempVal;
    • 7
      点赞
    • 14
      收藏
      觉得还不错? 一键收藏
    • 4
      评论
    评论 4
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值