Qt json解析心得

例子

  • 数据
jsondata={"cmd":"meetingmemberlist","memberinfos":[{"name":"李","number":"668162","status":"Offline"},{"name":"66668888","status":"Offline"},{"name":"1.221","number":"1234561","status":"Offline"},{"name":"1.42","status":"Offline"}],"session":"2989479764ll","touid":"19","xns":"18"}
  • 解析(可以直接通过对象来获取 json):
void  CEMViewMenuInteraction::get_memberdata_from_jsondate(std::string jsondata)
{
    QByteArray ByteArr = QByteArray(jsondata.c_str());
    //判断字符串转化为 QJsonDocument  是否出现了错误
    QJsonParseError jsonError;//Qt5新类
    QJsonDocument jsonDoc = QJsonDocument::fromJson(ByteArr, &jsonError);//Qt5新类
    if (jsonError.error == QJsonParseError::NoError)
   {
//        qDebug()<< "parse jsondata";
       if (jsonDoc.isObject())
       {
           QJsonObject rootObj = jsonDoc.object();
           QString cmd;
           QString session;
           //是否含有key  cmd
           if (rootObj.contains("cmd"))
           {
               //取出key为rootpath的值
               QJsonValue value = rootObj.value("cmd");
               //判断是否是string类型
               if (value.isString())
               {
                   cmd = value.toString();
//                   qDebug()<< "cmd=" <<cmd;
               }
           }
           if (rootObj.contains("session"))
           {
               //取出key为 session 的值
               QJsonValue value = rootObj.value("session");
               //判断是否是string类型
               if (value.isString())
               {
                   session = value.toString();
//                   qDebug()<< "session=" << session;
               }
           }
           if (rootObj.contains("memberinfos"))
           {
               QJsonValue valueArray = rootObj.value("memberinfos");
               //判断类型是否为array,并且将array遍历出来
               if (valueArray.isArray())
               {
                   QJsonArray jsonArray = valueArray.toArray();
                   QString child_name = "null";
                   QString child_status = "null";
                   for (int i = 0; i < jsonArray.count();i++)
                   {
                       QJsonValue childValue = jsonArray[i];
                       if (childValue.isObject())
                       {
                           QJsonObject  childObject = childValue.toObject();
                           if (childObject.contains("name"))
                           {
                               QJsonValue valueJson = childObject.value("name");
                               if (valueJson.isString())
                               {
                                   child_name = valueJson.toString();
//                                   qDebug()<< "name=" <<child_name;
                               }
                           }
                           if (childObject.contains("status"))
                           {
                               QJsonValue valueJson = childObject.value("status");
                               if (valueJson.isString())
                               {
                                   child_status = valueJson.toString();
//                                   qDebug()<< "status=" <<child_status;
                               }
                           }
                           m_MemberListMap[child_name] = child_status;
                       }
                   }
               }
           }

       }
   }
}

以上代码来自于网络。

  • 也可以用此方法(用jsonDoucment.toVariant()转了一次、和最后的toMap()、可以解析带[{…}]的数据)。第一种方法性能好一点
   if(jsonData.contains("Complex") == true)
    {
        QJsonParseError jsonError;

        QJsonDocument jsonDoucment = QJsonDocument::fromJson(jsonData, &jsonError);
        if(jsonError.error == QJsonParseError::NoError)
        {
            if(!(jsonDoucment.isNull()||jsonDoucment.isEmpty()))
            {
                QVariantList dataList=jsonDoucment.toVariant().toList();
                QString ip_psinout;
                foreach (QVariant data, dataList)
                {
                    QVariantMap Complex_dataMap = data.toMap();
                   ip_psinout  = QString("%1,%2 %3").arg(ipaddress)
                                                         .arg(Complex_dataMap.value("ps").toString())
                                                         .arg(Complex_dataMap.value("InOut").toString());
                    rec_map.insert(ip_psinout,Complex_dataMap);//链表list.at()返回的const常量不能使用成员函数,得用[]
                }
            }
            else
            {
                //检查错误类型
                qDebug()<<"jsonError:"<<jsonError.errorString();
            }
        }
    }

- 最后:不管是哪种方法、解析json数据的时候只能一组([{…}]或者{…})一组的传进去解析,不能多个组一起去解析,多个组一起不识别,可以做一个解析预处理,把收到的json数据分成好几组循环遍历解析。如解析[{…}]时:

    QString s=jsonData;
    //2.数据解析
    QString start ="[";
    QString end ="]";
    int a1=s.indexOf(start);
    int a2=s.indexOf(end);
    if(a1 == -1 || a2 == -1 || a1 > a2)
    {
        return ;
    }
    QString rec = s.mid(a1,a2-a1+1);//正规的数据
    int post = rec.indexOf(start,1);//判断里面是否有中括号
    if(post > -1)
    {
        return ;
    }
    qDebug()<<"rec"<<rec;
    dojsondata(rec.toLatin1());//解析json数据
    QString m_rec = s.mid(a2+1);//截取之后的
    //递归
    rawdata_recursion(m_rec.toLatin1());
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值