以json原文如下为例:
{//一级大括号
"first fruit":
{//二级大括号
"describe":"an apple",
"icon":"appleIcon",
"name":"apple"
},
"second fruit":
{
"describe":"an orange",
"icon":"orangeIcon",
"name":"orange"
},
"three fruit array":
[//二级中括号
"eat 0",
"eat 1",
"eat 2",
"eat 3",
"eat 4"
]
}
其中,我们可以将一级大括号内的所有内容看作是一个一级的QJsonObject,记作一级Obj;在一级Obj中,有两个并列的二级大括号,和中括号,这三者可以被分别看做一个二级Obj;以此类推甚至可以是N即Obj;
在每一级Obj中,根据关键字Key值,如在一级Obj内有三个Krey值: "first fruit", "second fruit","three fruit array";可以根据key值找到对应的二级Obj,然后可以在二级Obj中根据其中的key值找到三级的,以此类推;
如果某级Obj中不再含有下一级Obj,或者不仅含有下级Obj,如上面的二级大括号内就不在含有下级Obj,那么分两种情况,一种是以key:value的形式存在,如上面的两个二级大括号 中的内容。另一种是上面的二级中括号中以array形式存在的并列项,有点像是枚举一样。根据两种情况,用两种方式取出具体的某个值,如:"icon":"orangeIcon" 或"eat 1"。
根据以上对json结构的简单理解,再看下面的代码,可能会容易理解一点。尤其是第二部分的代码。
#include
#include
#include
#include
#include
#include
QFile loadFile("D:\\1.json");
if(!loadFile.open(QIODevice::ReadOnly))
{
qDebug() << "could't open projects json";
return;
}
QByteArray allData = loadFile.readAll();
loadFile.close();
QJsonParseError json_error;
QJsonDocument jsonDoc(QJsonDocument::fromJson(allData, &json_error));
if(json_error.error != QJsonParseError::NoError)
{
qDebug() << "json error!";
return;
}
QJsonObject rootObj = jsonDoc.object();
//输出所有key,这一步是非必须的
QStringList keys = rootObj.keys();
for(int i = 0; i < keys.size(); i++)
{
qDebug() << "key" << i << " is:" << keys.at(i);
}
//因为是预先定义好的JSON数据格式,所以这里可以这样读取
if(rootObj.contains("first fruit"))
{
QJsonObject subObj = rootObj.value("first fruit").toObject();
qDebug() << "describe is:" << subObj["describe"].toString();
qDebug() << "icon is:" << subObj["icon"].toString();
qDebug() << "name is:" << subObj["name"].toString();
}
if(rootObj.contains("second fruit"))
{
QJsonObject subObj = rootObj.value("second fruit").toObject();
qDebug() << "describe is:" << subObj.value("describe").toString();
qDebug() << "icon is:" << subObj.value("icon").toString();
qDebug() << "name is:" << subObj.value("name").toString();
}
if(rootObj.contains("three fruit array"))
{
QJsonArray subArray = rootObj.value("three fruit array").toArray();
for(int i = 0; i< subArray.size(); i++)
{
qDebug() << i<<" value is:" << subArray.at(i).toString();
}
}
输出结果:
key 0 is: "first fruit"
key 1 is: "second fruit"
key 2 is: "three fruit array"
describe is: "an apple"
icon is: "appleIcon"
name is: "apple"
describe is: "an orange"
icon is: "orangeIcon"
name is: "orange"
0 value is: "eat 0"
1 value is: "eat 1"
2 value is: "eat 2"
3 value is: "eat 3"
4 value is: "eat 4"
上面是只含有两级Obj的情况,下面是更复杂一点的多级obj,只要遵循一点,就是在每一级上,将obj作为一个独立的obj,使用一样的方式再向其所包含的下一级obj获取信息,就容易些。
1.读取Json文档中的值:
QString getJsonParas(QString path, QString firstFlag, QString secondFlag,int index)
{
QString paras="";
QFile file(path);
if (!file.open(QIODevice::ReadOnly)){
qDebug()<<"file.open ReadOnly fail";
return "";
}
//从json文件读取信息
QByteArray allData=file.readAll();
file.close();
//qDebug()<
QJsonDocument jsonDoc;
jsonDoc=QJsonDocument::fromJson(allData, &json_error);
if(json_error.error != QJsonParseError::NoError)
{
qDebug() << "json error!";
qDebug()<
}
QJsonObject rootObj = jsonDoc.object();
QStringList keys = rootObj.keys();
if(rootObj.contains(firstFlag)){
QJsonObject subObj=rootObj.value(firstFlag).toObject();
if(subObj.contains(secondFlag)){
if(!subObj.value(secondFlag).isObject()){
return subObj.value(secondFlag).toString();
}
}
}
else{
for(int i=0;i
QJsonObject subObj=rootObj.value(flag).toObject();//从一级OBJ得到二级OBJ
QStringList keyss=subObj.keys();
if(subObj.contains(firstFlag)){
QJsonArray exchanges=subObj.value(firstFlag).toArray();//从二级OBJ得到三级中括号形式的OBJ即array
QJsonObject exchange=exchanges.at(0).toObject();//将三级的array中的第几个元素转为第四级的OBJ
if(!exchange.value(secondFlag).isArray()){//判断第四级OBJ中是否含有名叫secondFlag的key
return exchange.value(secondFlag).toString();
}
}
// else{
// for(int j=0;j
// QJsonObject subObjs=rootObj.value(flagkey).toObject();
// if(subObjs.contains(firstFlag)){
// QJsonArray queues=subObjs.value(firstFlag).toArray();
// QJsonObject queue=queues.at(index).toObject();
// return queue.value(secondFlag).toString();
// }
// }
// }
}
//
QJsonObject subObj=rootObj.value("virtualhost").toObject();
QJsonArray exchanges=subObj.value("exchanges").toArray();
QJsonObject exchange=exchanges.at(0).toObject();
if(exchange.contains(firstFlag)){
QJsonArray queues=exchange.value(firstFlag).toArray();
QJsonObject queue=queues.at(index).toObject();
if(queue.contains(secondFlag)){
return queue.value(secondFlag).toString();
}
}
subObj=rootObj.value("virtualhost").toObject();
exchanges=subObj.value("exchanges1").toArray();
exchange=exchanges.at(0).toObject();
if(exchange.contains(firstFlag)){
QJsonArray queues=exchange.value(firstFlag).toArray();
QJsonObject queue=queues.at(index).toObject();
if(queue.contains(secondFlag)){
return queue.value(secondFlag).toString();
}
}
}
2.修改json文档中属性的值:
bool setJsonParas(QString path, QString firstFlag, QString secondFlag,int index,QString para)
{
QFile file(path);
if (!file.open(QIODevice::ReadOnly)){
qDebug()<<"file.open ReadOnly fail";
return "";
}
//从json文件读取信息
bool res=false;
QByteArray allData=file.readAll();
file.close();
QJsonParseError json_error;
QJsonDocument jsonDoc;
jsonDoc=QJsonDocument::fromJson(allData, &json_error);
if(json_error.error != QJsonParseError::NoError)
{
qDebug() << "json error!";
qDebug()<
}
QJsonObject rootObj = jsonDoc.object();
QStringList keys = rootObj.keys();
if(rootObj.contains(firstFlag)){
QJsonObject subObj=rootObj.value(firstFlag).toObject();
if(subObj.contains(secondFlag)){
QJsonValue jsonvalue(para);
subObj.insert(secondFlag,jsonvalue);
res=true;
QJsonValue subvalue(subObj);
rootObj.insert(firstFlag,subvalue);
}
}
else{
for(int i=0;i
QJsonObject subObj=rootObj.value(key).toObject();
if(subObj.contains(firstFlag)){
QJsonArray subObjarray=subObj.value(firstFlag).toArray();
QJsonObject subOjs=subObjarray.at(0).toObject();
if(subOjs.contains(secondFlag)){
QJsonValue jsonvalue(para);
subOjs.insert(secondFlag,jsonvalue);
res=true;
QJsonArray jsonArray;
QJsonValue subsValue(subOjs);
jsonArray.insert(0,subsValue);
QJsonValue subValue(jsonArray);
subObj.insert(firstFlag,subValue);
QJsonValue rootValue(subObj);
rootObj.insert(key,rootValue);
}
}
}
}
QJsonObject subObj=rootObj.value("virtualhost").toObject();
QJsonArray subArray=subObj.value("exchanges").toArray();
QJsonObject subsObj=subArray.at(0).toObject();
if(subsObj.contains(firstFlag)){
QJsonArray subObjArray=subsObj.value(firstFlag).toArray();
QJsonObject subObj1=subObjArray.at(index).toObject();
if(subObj1.contains(secondFlag)){
QJsonValue jonsvalue(para);
subObj1.insert(secondFlag,jonsvalue);
res=true;
QJsonValue subvalue1(subObj1);
subObjArray.removeAt(index);
subObjArray.insert(index,subvalue1);
QJsonValue subsvalue(subObjArray);
subsObj.insert(firstFlag,subsvalue);
QJsonValue subsObjvalue(subsObj);
subArray.removeAt(0);
subArray.insert(0,subsObjvalue);
QJsonValue subvalue(subArray);
subObj.insert("exchanges",subvalue);
QJsonValue rootvalue(subObj);
rootObj.insert("virtualhost",rootvalue);
}
}
if(res==false){
return res;
}
QFile filejson(path);
if( !filejson.open( QFile::WriteOnly | QFile::Truncate) ){
qWarning("error::ParserXML->writeOperateXml->file.open\n");
return false;
}
QJsonDocument json;
json.setObject(rootObj);
QByteArray byte_array = json.toJson();
filejson.write(byte_array);
filejson.close();
return true;
}