qt中生成含有中文的json文件和解析json文件
生活随笔
收集整理的這篇文章主要介紹了
qt中生成含有中文的json文件和解析json文件
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
提要
生成的json文件在程序加載解析時出現(xiàn)上述錯誤,究其原因是生成json文件過程中編碼問題。qt編譯器默認的編碼格式為utf-8,而windows一般為gbk編碼,所以就需要在生成本地json文件的時候?qū)tf-8編碼轉(zhuǎn)換為gbk編碼。讀取json文件的時候,將gbk編碼轉(zhuǎn)換為utf-8編碼。
示例
json文件格式
{"btnInfo": [{"id": 10008,"index": 1,"name": "場景8"}, {"id": 10026,"index": 2,"name": "場景K-P蝴蝶飛"}, {"id": 10014,"index": 3,"name": "場景即"}, {"id": 10021,"index": 6,"name": "場景及對QP"}, {"id": 10021,"index": 7,"name": "場景及對QP"}] }生成json文件為本地編碼。
void SystemScenenForm::createJsonFile() {QJsonObject data;QJsonObject subData1;QJsonArray array;int index;QMap<int,stuSceNameId>::iterator it;for(it = m_btnInfoMap.begin(); it != m_btnInfoMap.end(); ++it){index = it.key();stuSceNameId temp = *it;subData1.insert("index",index);subData1.insert("id",temp.id);subData1.insert("name",QString::fromLocal8Bit(temp.name.toLocal8Bit()));//將utf-8轉(zhuǎn)換為gbkarray.append(subData1);}data.insert("btnInfo",array);QJsonDocument document;document.setObject(data);QByteArray jsonArray = document.toJson(QJsonDocument::Compact);QString strJson(jsonArray);QString strName = QCoreApplication::applicationDirPath() + "/sceneBtnInfo.json";QFile file(strName);if(!file.open(QIODevice::WriteOnly | QIODevice::Text)){QString strTitle = "提示";QString strContent = QString("%1文件打開失敗!").arg(strName);QMessageBox::information(this,strTitle,strContent);return ;}QTextStream in(&file);//生成的json文件中編碼為gbkin<<strJson;file.close(); }讀取json文件時將本地編碼進行轉(zhuǎn)換為gbk編碼。
QString SystemScenenForm::readSceneBtnInfo(QString fileName) {QByteArray allData; #ifdef OUT_PUToutPut<<"文件路徑及名稱:"<<fileName; #endifQTextCodec *code = QTextCodec::codecForName("GBK");QFile file(fileName);if (!file.open(QIODevice::ReadOnly)){ #ifdef OUT_PUToutPut<<QString("%1配置文件讀取失敗!").arg(fileName); #endifreturn allData;}allData = file.readAll();QString str = code->toUnicode(allData);//gbk編碼的QByteArray類型變量轉(zhuǎn)換為utf-8編碼的QString變量file.close(); #ifdef OUT_PUT // outPut<<"json文件內(nèi)容:"<<allData; #endifreturn str; }void SystemScenenForm::parseSceneBtnJson(QByteArray &byteArray) {int tempIndex;stuSceNameId tempStu;if(m_btnInfoMap.size() != 0){m_btnInfoMap.clear();}QJsonObject jsonObject;QJsonParseError jsonError;QJsonDocument document = QJsonDocument::fromJson(byteArray,&jsonError);if(!document.isEmpty() && jsonError.error == QJsonParseError::NoError){QJsonObject resultObject = document.object();QJsonValue jsonValue = resultObject.value("btnInfo");if(jsonValue.isArray()){QJsonArray jsonArray = jsonValue.toArray();for(int i = 0; i < jsonArray.size(); ++i){jsonObject = jsonArray.at(i).toObject();tempIndex = jsonObject.value("index").toInt();tempStu.id = jsonObject.value("id").toInt();tempStu.name = jsonObject.value("name").toString();m_btnInfoMap.insert(tempIndex,tempStu);}}}else{outPut<<"sceneBtnInfo.json文件解析失敗"<<jsonError.errorString();} }//讀取json文件時函數(shù)的調(diào)用,調(diào)用的為上面的函數(shù) QString byteArray = readSceneBtnInfo(strName); outPut<<"讀到的字符串:"<<byteArray; if(byteArray.size() == 0) {return ; } QByteArray array = byteArray.toUtf8();//將utf-8編碼的QString類型變量轉(zhuǎn)換為utf-8的QByteArray類型變量 parseSceneBtnJson(array);這樣就解決了生成含有中文的json文件出現(xiàn)亂碼的情況。
總結(jié)
以上是生活随笔為你收集整理的qt中生成含有中文的json文件和解析json文件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大端字节序与小端字节序的转换
- 下一篇: qt下QString转换为const c