日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

qt中生成含有中文的json文件和解析json文件

發(fā)布時(shí)間:2024/9/27 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 qt中生成含有中文的json文件和解析json文件 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

提要

生成的json文件在程序加載解析時(shí)出現(xiàn)上述錯(cuò)誤,究其原因是生成json文件過程中編碼問題。qt編譯器默認(rèn)的編碼格式為utf-8,而windows一般為gbk編碼,所以就需要在生成本地json文件的時(shí)候?qū)tf-8編碼轉(zhuǎn)換為gbk編碼。讀取json文件的時(shí)候,將gbk編碼轉(zhuǎn)換為utf-8編碼。

示例

json文件格式

{"btnInfo": [{"id": 10008,"index": 1,"name": "場(chǎng)景8"}, {"id": 10026,"index": 2,"name": "場(chǎng)景K-P蝴蝶飛"}, {"id": 10014,"index": 3,"name": "場(chǎng)景即"}, {"id": 10021,"index": 6,"name": "場(chǎng)景及對(duì)QP"}, {"id": 10021,"index": 7,"name": "場(chǎng)景及對(duì)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文件時(shí)將本地編碼進(jìn)行轉(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í)函數(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文件的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。