Qt对json的修改
下面,对my.json中grade和name的第一个元素进行修改
toObject()、toArray()都会开辟新内存,这是我们认为改了,但是没有生效的原因所在。即在新内存上改了之后,需重新赋回旧内存。
核心代码:三板斧【一路to过去】【改】【一路赋回】
// 获取根 { } QJsonObject rootObj = doc.object(); //从根→grade节点,一路to过去,遇{}toObject,遇[]toArray。 QJsonObject languagesObj=rootObj["languages"].toObject(); QJsonObject serialOneObj=languagesObj["serialOne"].toObject(); //to到serialOne节点,就可以改grade了 serialOneObj["grade"]=30; //赋回前一个节点(一路往回赋,直到根) languagesObj["serialOne"]=serialOneObj; rootObj["languages"]=languagesObj; // 将object设置为本文档的主要对象 doc.setObject(rootObj);
同理,改name的第一个元素
// 获取根 { } QJsonObject rootObj = doc.object(); //从根→name节点,一路to过去,遇{}toObject,遇[]toArray。 QJsonObject languagesObj=rootObj["languages"].toObject(); QJsonObject serialOneObj=languagesObj["serialOne"].toObject(); QJsonArray nameArray= serialOneObj["name"].toArray(); //to到name节点,才可以改其中元素 nameArray[0]="法语"; //赋回前一个节点(一直往回赋,直到根) serialOneObj["name"]=nameArray; languagesObj["serialOne"]=serialOneObj; rootObj["languages"]=languagesObj; // 将object设置为本文档的主要对象 doc.setObject(rootObj);
全部代码:
#include <QCoreApplication> #include<QFile> #include<QJsonDocument> #include<QJsonObject> #include<QJsonArray> #include<QJsonValue> #include<QJsonParseError> #pragma execution_character_set("utf-8") //防止中文乱码,与 utf8带BOM 配合使用 int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QFile file("my.json"); if (!file.open(QFile::ReadOnly | QFile::Text)) { qDebug() << "can't open error!"; return 0; } // 读取文件的全部内容 QTextStream stream(&file); stream.setCodec("UTF-8"); // 设置读取编码是UTF8 QString str = stream.readAll(); file.close(); // QJsonParseError类用于在JSON解析期间报告错误。 QJsonParseError jsonError; // 将json解析为UTF-8编码的json文档,并从中创建一个QJsonDocument。 // 如果解析成功,返回QJsonDocument对象,否则返回null QJsonDocument doc = QJsonDocument::fromJson(str.toUtf8(), &jsonError); // 判断是否解析失败 if (jsonError.error != QJsonParseError::NoError && !doc.isNull()) { qDebug() << "Json格式错误!" << jsonError.error; return 0; } // 获取根 { } QJsonObject rootObj = doc.object(); //从根→name节点,一路to过去,遇{}toObject,遇[]toArray。 QJsonObject languagesObj=rootObj["languages"].toObject(); QJsonObject serialOneObj=languagesObj["serialOne"].toObject(); QJsonArray nameArray= serialOneObj["name"].toArray(); //to到serialOne节点,就可以改grade了 serialOneObj["grade"]=30; //to到name节点,才可以改其中元素 nameArray[0]="法语"; //赋回前一个节点(一直往回赋,直到根) serialOneObj["name"]=nameArray; languagesObj["serialOne"]=serialOneObj; rootObj["languages"]=languagesObj; // 将object设置为本文档的主要对象 doc.setObject(rootObj); // 重写打开文件,覆盖原有文件,达到删除文件全部内容的效果 QFile writeFile("abc.json"); if (!writeFile.open(QFile::WriteOnly | QFile::Truncate)) { qDebug() << "can't open error!"; return 0; } // 将修改后的内容写入文件 QTextStream wirteStream(&writeFile); wirteStream.setCodec("UTF-8"); // 设置读取编码是UTF8 wirteStream << doc.toJson(); // 写入文件 writeFile.close(); // 关闭文件 return a.exec(); }
【更齐全的内容】
请参考此博客,也感谢作者的耐心回答! Qt 操作Json格式文件(创建、插入、解析、修改、删除)