QJson在http通讯中的使用

QJson常在http通讯中使用,涉及的类有QJsonObject、QJsonDocument、QJsonArray、QJsonValue等

一、解析QJson

以在http的接收信息槽函数中为例:

void Widget::replyFinished(QNetworkReply *reply)
{
    if(reply->error()==QNetworkReply::NoError)
    {
        qDebug()<<"url:"<<reply->url();                //url地址
        QString relayType=reply->url().toString();
        relayType.remove(0,relayType.indexOf("Channel",0)+8);//根据url后缀来区别指令功能
        const QByteArray reply_data=reply->readAll();    //用QBytearray存放http接收内容
        //qDebug()<<"read all:"<<reply_data;
        QJsonParseError json_error;
        QJsonDocument document = QJsonDocument::fromJson(reply_data,&json_error);//QBytearray转为QJsonDocument
        if(json_error.error==QJsonParseError::NoError)
        {
            if(document.isObject())                        //若为json对象
            {
                const QJsonObject obj = document.object(); //转化为json对象
                if(relayType.indexOf("get",0)>=0)
                {
                    QJsonValue jvalue=obj.value("success");//对象中关键字为"success"的值,可以用QJsonObject.contains(QString key)来查询是否该关键字的值
                    if(jvalue.toBool())
                    {
                        QJsonValue jv = obj.value("response");
                        if(jv.isArray())                    //此处的jv为包含json对象的json值,当json多层嵌套时使用该方法获取
                        {
                            QJsonArray array = jv.toArray();
                            for(int i=0;i<array.size();i++) //size标识数组中元素个数
                            {
                                QJsonObject jo= array.at(i).toObject();
                                ui->textEdit->append("上传时间:"+jo.value("uploadTime").toString());
                                ui->textEdit->append("应用名:"+jo.value("appName").toString());
                                ui->textEdit->append("版本号:"+jo.value("appVersion").toString());
                                ui->textEdit->append("下载次数:"+jo.value("downloads").toString());
                                ui->textEdit->append("更新时间:"+jo.value("updatTime").toString());
                                ui->textEdit->append("程序路径:"+jo.value("appPath").toString());
                                ui->textEdit->append("标记:"+jo.value("remark").toString());
                                ui->textEdit->append("id:"+jo.value("id").toString());
                            }
                        }
                        else
                        {
                            QJsonObject jo2=jv.toObject();
                            ui->textEdit->append("上传时间:"+jo2.value("uploadTime").toString());
                            ui->textEdit->append("应用名:"+jo2.value("appName").toString());
                            ui->textEdit->append("版本号:"+jo2.value("appVersion").toString());
                            lastVersion=jo2.value("appVersion").toString();
                            ui->textEdit->append("下载次数:"+jo2.value("downloads").toString());
                            ui->textEdit->append("更新时间:"+jo2.value("updatTime").toString());
                            ui->textEdit->append("程序路径:"+jo2.value("appPath").toString());
                            ui->textEdit->append("标记:"+jo2.value("remark").toString());
                            ui->textEdit->append("id:"+jo2.value("id").toString());
                        }
                    }
                    else
                    {
                        ui->textEdit->append("获取版本信息失败");
                    }
                }
                if(obj.contains("success"))
                {
                    QString str,res;
                    if(relayType=="gatherPassInfo")
                        str="上传旅客通行记录-->";
                    else if(relayType=="equipmentState")
                        str="上传通道运行状态-->";
                    else if(relayType=="gateAlarm")
                        str="报警推送-->";
                    else if(relayType=="uploadCount")
                        str="上传统计数据-->";
                    else if(relayType=="clearAlarm")
                        str="清除异常-->";
                    QJsonValue value = obj.value("success");
                    if(value.toBool())
                        res="成功";
                    else
                    {
                        res="失败";
                        QJsonValue err=obj.value("error");
                        ui->textEdit->append(err.toString());
                    }
                    ui->textEdit->append(str+res);
                }
            }
        }
        else
        {
            if(relayType.indexOf("download",0)>=0)        //http接收文件
            {
                QByteArray fileba = reply->rawHeader("Content-Disposition");//文件名存放于报文头
                QString filename = fileba;
                filename.remove(0,filename.indexOf("filename",0)+10);
                filename.remove(filename.length()-1,1);
                QFile file(filename);                //用获取到的文件名创建文件
                file.open(QIODevice::WriteOnly);
                file.write(reply_data);              //写入文件
                file.close();
                return;
            }
            qDebug()<<"json error:"<<json_error.errorString();
        }
    }
    reply->deleteLater();
}

二、QByteArray和QJson转化

QByteArray转Json

//QByteArray转为Json对象
QJsonDocument document = QJsonDocument::fromJson(QBytearray);
QJsonObject obj = document.object();
//获取key的值
QJsonValue jv = obj.value("key");
QString str=jv.toString();

Json转QByteArray

QJsonObject obj;
obj.insert(QString key,QJsonValue value);
obj.insert.....
QJsonDocument doc;
doc.setObject(obj);
QBytearray ba=doc.toJson(QJsonDocument::Compact);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值