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);