<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # 【Qt編程】基于Qt的詞典開發系列--JSON數據解析 在上一篇文章《[用戶登錄及API調用的實現](http://blog.csdn.net/tengweitw/article/details/45932429)》中,我通過程序實現了用戶登錄及API調用的實現,從而能夠實現網絡查詞、添詞的操作。但是,從上文中可以看到,調用API后返回的是JSON格式的數據,如下圖所示(在QtCreator中的顯示):? ![](https://box.kancloud.cn/2016-01-15_5698c1c86f5d8.jpg) 為了更好的觀察JSON格式,我整理后顯示如下:? ![](https://box.kancloud.cn/2016-01-15_5698c1c87fa2a.jpg) 顯然,為了顯示查詞的結果,我們必須在上圖中提取有用的信息,并正確的顯示出來。上圖中每一行內容的意思我已經在文章《[調用網絡API](http://blog.csdn.net/tengweitw/article/details/45484803)》中作了解釋。我在詞典中選擇想要顯示的內容有:單詞本身、單詞ID、中文解釋、英文解釋、音標、發音音頻,與之對應上圖中的content、learning_id、definition、en_definitions、pron、audio。 為了獲取這些內容,我們必須進行對上面的JSON格式數據(關于什么是JSON格式,可以自己百度)進行解析。在Qt 4中,沒有對應的模塊,必須單獨加入相應的函數庫,當然也可以自己根據JSON的格式自己寫程序提取你想要的內容,只不過比較麻煩而已。在Qt5中,自帶有對應的JSON解析模塊,因此不用自己來寫解析函數了,只需要調用相應的函數。**下面給出具體的程序實現:** 程序的主體框架與文章《[用戶登錄及API調用的實現](http://blog.csdn.net/tengweitw/article/details/45932429)》中的一樣,只是在其中加入了JSON數據解析功能。具體的說,每當發送查詞請求后,服務器就會返回JSON格式的單詞內容。因此,我們只需要在處理服務器返回數據的函數replyfinished()函數中對應的查詞操作QueryWordAction中進行JSON數據解析,將我們需要的內容存儲到我們定義的Word類中。其中,word的定義如下:? ![](https://box.kancloud.cn/2016-01-15_5698c1c89334c.jpg) 由于只是在上文《[用戶登錄及API調用的實現](http://blog.csdn.net/tengweitw/article/details/45932429)》的程序中加了JSON解析的部分,其它部分基本沒變,所以程序的運行流程及思路可見上文。當然,程序中的注釋也算比較詳細,因此不作具體說明。只需要將下面五個源文件放入空的Qt項目中即可。注意:是在Qt 5中,且需要在其.pro文件中加入語句:QT +=core gui network webkit multimedia。**具體的源文件如下**: * * * **1、word.h文件** ~~~ #ifndef WORD_H #define WORD_H #include<QString> #include<List> #include <QJsonObject> #include<QtMultimedia/QMediaPlayer> #include<QUrl> class Word { public: explicit Word(); Word(const Word& word); ~Word(); public: QString name;//單詞本身 QString learning_id;//單詞ID QString definition;//單詞中文解釋 QString en_definitions;//單詞英文解釋 QString pron;//單詞音標 QString audio;//單詞的發音音頻 void clear(); }; #endif // WORD_H ~~~ * * * **2、word.cpp文件** ~~~ #include "word.h" Word::Word() { } Word::Word(const Word &w) { name=w.name; learning_id=w.learning_id; definition=w.definition; en_definitions=w.en_definitions; pron=w.pron; audio=w.audio; } Word::~Word() { } void Word::clear()//清除內容 { name=""; learning_id=""; definition=""; en_definitions=""; pron=""; audio=""; // this->examples=NULL; } ~~~ * * * **3、network.h文件** ~~~ #ifndef NETWORK_H #define NETWORK_H #include"word.h" #include <QObject> #include <QtNetwork/QNetworkAccessManager> #include<QtNetwork/QNetworkReply> #include<QtNetwork/QNetworkRequest> #include<QtNetwork/QNetworkCookie> #include<QtNetwork/QNetworkCookieJar> #include <QJsonDocument> #include <QJsonObject> #include <QJsonArray> #include <QJsonValue> #include<QString> #include<QDebug> #include<QList> #include<QUrl> #include<QByteArray> class netWork : public QObject { Q_OBJECT public: explicit netWork(QObject *parent = 0); // ~netWork(); enum HttpAction{NoAction,NetStudy,GetSessionidAction,LoginAction,QueryWordAction,AddWordAction,AddExampleAction,QueryWordExamplesAction}; HttpAction httpAction; QNetworkAccessManager * http; QString sessionid; QString queryword;//要查詢的單詞 QString nickname; QString username; QString password; bool isBusy; Word *gotword;//通過訪問網絡得到的單詞信息 QString getCookie(const QString &name); void loginShanbay(); void queryWord(const QString &word); void queryExamples(QString learningid); void connectNet(QString username="nineheadedbird", QString password="123456"); void addWord(const QString &word); signals: void signalQueryFinished(Word *word); void connectSuccess(); void connectFail(); void verifySuccess(); void verifyFail(); void NetState(bool); public slots: void replyfinished(QNetworkReply*); }; #endif // NETWORK_H ~~~ * * * **4、network.cpp文件** ~~~ #include "network.h" #include<QList> #include<QDesktopServices> netWork::netWork(QObject *parent) : QObject(parent) { http=new QNetworkAccessManager(this); http->setCookieJar(new QNetworkCookieJar(this)); connect(http,SIGNAL(finished(QNetworkReply*)),this,SLOT(replyfinished(QNetworkReply*))); isBusy=true; gotword=new Word(); } QString netWork::getCookie(const QString &name) { foreach(QNetworkCookie cookie , http->cookieJar()->cookiesForUrl(QUrl("http://www.shanbay.com/"))) { //qDebug()<<cookie.name(); if(cookie.name()==name) { return cookie.value(); } } return ""; } void netWork::loginShanbay() { QNetworkRequest request; request.setUrl(QUrl("http://www.shanbay.com/accounts/login/")); request.setRawHeader("Accept","text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); request.setRawHeader("Accept-Charset","GBK,utf-8;q=0.7,*;q=0.3"); request.setRawHeader("Accept-Language","zh-CN,zh;q=0.8"); request.setRawHeader("Cache-Control","max-age=0"); request.setRawHeader("Connection","keep-alive"); request.setRawHeader("Host","www.shanbay.com"); request.setRawHeader("User-Agent","Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.63 Safari/535.7"); request.setRawHeader("Origin","http//www.shanbay.com"); request.setRawHeader("Referer","http://www.shanbay.com/accounts/login/"); request.setRawHeader("Host","www.shanbay.com"); request.setRawHeader("Content-Type","application/x-www-form-urlencoded"); QByteArray postData; postData.append(QString("csrfmiddlewaretoken=%1&").arg(sessionid)); postData.append(QString("username=%1&password=%2&").arg(QUrl::toPercentEncoding(username).constData()).arg(password)); postData.append("login=登錄&continue=home&u=1&next="); request.setHeader(QNetworkRequest::ContentLengthHeader,postData.size()); httpAction=LoginAction; http->post(request,postData); } void netWork::queryWord(const QString &word) { QNetworkRequest request; request.setUrl(QUrl("http://www.shanbay.com/api/word/"+word)); request.setRawHeader("Accept","text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); request.setRawHeader("Accept-Charset","GBK,utf-8;q=0.7,*;q=0.3"); request.setRawHeader("Accept-Language","zh-CN,zh;q=0.8"); request.setRawHeader("Cache-Control","max-age=0"); request.setRawHeader("Connection","keep-alive"); request.setRawHeader("Host","www.shanbay.com"); request.setRawHeader("User-Agent","Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.63 Safari/535.7"); httpAction=QueryWordAction; http->get(request); } void netWork::queryExamples(QString learningid) { if(learningid=="0"){ return; } QNetworkRequest request; request.setUrl(QUrl("http://www.shanbay.com/api/learning/examples/"+learningid)); request.setRawHeader("Accept","text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); request.setRawHeader("Accept-Charset","GBK,utf-8;q=0.7,*;q=0.3"); request.setRawHeader("Accept-Language","zh-CN,zh;q=0.8"); request.setRawHeader("Cache-Control","max-age=0"); request.setRawHeader("Connection","keep-alive"); request.setRawHeader("Host","www.shanbay.com"); request.setRawHeader("User-Agent","Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.63 Safari/535.7"); httpAction=QueryWordExamplesAction; http->get(request); } void netWork::addWord(const QString &word) { if(word.isEmpty()) qDebug()<<"你的輸入有誤"; else { QNetworkRequest request; request.setUrl(QUrl("http://www.shanbay.com/api/learning/add/"+word)); request.setRawHeader("Accept","text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); request.setRawHeader("Accept-Charset","GBK,utf-8;q=0.7,*;q=0.3"); request.setRawHeader("Accept-Language","zh-CN,zh;q=0.8"); request.setRawHeader("Cache-Control","max-age=0"); request.setRawHeader("Connection","keep-alive"); request.setRawHeader("Host","www.shanbay.com"); request.setRawHeader("User-Agent","Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.63 Safari/535.7"); httpAction=AddWordAction; http->get(request); } } void netWork::connectNet(QString username, QString password) { this->username=username; this->password=password; QNetworkRequest request; request.setUrl(QUrl("http://www.shanbay.com/accounts/login/")); request.setRawHeader("Accept","text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); request.setRawHeader("Accept-Charset","GBK,utf-8;q=0.7,*;q=0.3"); request.setRawHeader("Accept-Language","zh-CN,zh;q=0.8"); request.setRawHeader("Cache-Control","max-age=0"); request.setRawHeader("Connection","keep-alive"); request.setRawHeader("Host","www.shanbay.com"); request.setRawHeader("User-Agent","Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.63 Safari/535.7"); httpAction=GetSessionidAction; http->get(request); } void netWork::replyfinished(QNetworkReply *reply) { QByteArray wordInformation; QVariant status_code=reply->attribute(QNetworkRequest::HttpStatusCodeAttribute); // qDebug()<<"code_state="<<status_code; if(status_code==QVariant::Invalid) emit NetState(false); else emit NetState(true); QJsonDocument jsonDoc; QJsonObject jsonObj,vocObj,en_definitionsObj; switch(httpAction) { case NoAction: break; case GetSessionidAction: sessionid=getCookie("csrftoken"); if(!sessionid.isEmpty()){ emit connectSuccess(); qDebug()<<("Connect successfully! Verifying username and password..."); loginShanbay(); }else{ emit connectFail(); qDebug()<<("Cannot connect! Please try to check the internet!"); } break; case LoginAction: httpAction=NoAction; if(0==reply->readAll().size()) { QString nickname=QUrl::fromPercentEncoding(getCookie("username").toLatin1()); emit verifySuccess(); qDebug()<<"Login successfully!"<<nickname; queryWord("hello"); }else { emit verifyFail(); qDebug()<<"Failed to login! Please check!"; } break; case QueryWordAction://是在這里面進行JSON數據解析! qDebug()<<"----query word----"; wordInformation=reply->readAll(); qDebug()<<"the information of word in JSON format::\n"; qDebug()<< wordInformation; jsonDoc=QJsonDocument::fromJson( wordInformation); if(!jsonDoc.isNull()) { jsonObj=jsonDoc.object(); vocObj=jsonObj.value("voc").toObject();//Qt5 自帶JSON解析,因此很容易得到單詞的各個部分的內容 en_definitionsObj=vocObj.value("en_definitions").toObject(); gotword->clear(); gotword->name=vocObj.value("content").toString();//單詞本身 gotword->learning_id=QString::number(jsonObj.value("learning_id").toDouble(),'g',15); gotword->definition=vocObj.value("definition").toString();//中文解釋 gotword->pron=vocObj.value("pron").toString();//單詞音標 gotword->pron=gotword->pron; gotword->audio=vocObj.value("audio").toString(); //由于單詞的英文解釋有多項(詞性、解釋等等),我們將結果用html格式表示,并使得詞性顏色設置為黑色 for( QJsonObject::const_iterator it=en_definitionsObj.constBegin();it!=en_definitionsObj.constEnd();it++) { gotword->en_definitions+=QString("<br><font color='black'><b>%1\. </b></font>").arg(it.key()); if(it.value().isArray()) { foreach(QJsonValue jv,it.value().toArray()) { gotword->en_definitions+=QString("%1; ").arg(jv.toString()); } } gotword->en_definitions+="<br>"; } emit signalQueryFinished(gotword); //顯示JSON解析后的數據 qDebug()<<"name="<<gotword->name; qDebug()<<"word="<<gotword->learning_id; qDebug()<<"definition="<<gotword->definition; qDebug()<<"en_definitions="<<gotword->en_definitions; qDebug()<<"pron="<<gotword->pron; qDebug()<<"audio"<<gotword->audio; //進行網絡發音 QMediaPlayer *player = new QMediaPlayer(); player->setMedia(QUrl(gotword->audio)); player->play(); if(gotword->learning_id!="0")//不是新單詞 { qDebug()<<"你學過這個單詞"; } } break; case QueryWordExamplesAction: // qDebug()<<"query word examples"; // qDebug()<<reply->readAll(); break; case AddWordAction: // qDebug()<<"add word"; jsonDoc=QJsonDocument::fromJson(reply->readAll()); if(!jsonDoc.isNull()) { jsonObj=jsonDoc.object(); //qDebug()<<"jsonObj"<<jsonObj; gotword->learning_id=QString::number(jsonObj.value("id").toDouble(),'g',15); // qDebug()<<jsonObj.value("id").toDouble()<<"add word result learning id="<<gotword->learning_id<< (gotword->learning_id!="0"); // emit signalAddwordFinished(DICT::word->learning_id!="0"); // queryExamples(DICT::word->learning_id); } default:break; } } ~~~ * * * **5、main.cpp文件** ~~~ #include <QApplication> #include "network.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); netWork *nW = new netWork(); nW->connectNet(); return a.exec(); } ~~~ **運行結果如下圖:**? ![](https://box.kancloud.cn/2016-01-15_5698c1c8a3912.jpg)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看