알쓸전컴(알아두면 쓸모있는 전자 컴퓨터)

Qt json 파싱 with webpage(ajax) 간단 사용법 본문

QT

Qt json 파싱 with webpage(ajax) 간단 사용법

백곳 2018. 4. 9. 22:09

Qt json parer 사용법 


 Qt 에서는 기본적으로 


Json 라이브러리를 제공해 줍니다. 


제가 json 으로 가져올 데이터는 


http://comp.fnguide.com/SVO2/common/sp_read_json.asp?cmdText=menu_6_2&IN_U_CD=I.001&IN_MARKET_GB=&IN_REPORT_GB=A&IN_SORT=9



위 사이트는 간단한 주식 데이터 사이트 입니다. 


json 형식으로 되어 있습니다. 


방식은 get 방식 입니다. 


해당 사이트로부터 데이터를 받아와서 json 으로 파싱 하는 샘플 코드 및 리뷰를 하겠습니다. 


데이터 내용은 


[{"RANK":1,"name":"\uD06C\uB77C\uC6B4\uD574\uD0DC\uD640\uB529\uC2A4","결산년월":"201712","시장":"\uC720","DEBT":"20.96","BYE":"3,726.98","SALES":"26,890.05","EPSRATE":"1,168.62","ROA":"36.91","ROE":"56.94","EPS":"13,957","BPS":"19,135","PER":"1.08","PBR":"0.79","EV/EBITDA":"70.69","GICODE":"A005740"},{"RANK":2,"name":"\uB300\uC131\uC0B0\uC5C5","결산년월":"201712","시장":"\uC720","DEBT":"153.84","BYE":"70.14","SALES":"1,663.58","EPSRATE":"8,659.72","ROA":"29.68","ROE":"55.26","EPS":"3,282","BPS":"8,507","PER":"1.17","PBR":"0.45","EV/EBITDA":"N\/A","GICODE":"A128820"},{"RANK":3,"name":"\uC774\uC2A4\uD0C0\uCF54","결산년월":"201712","시장":"\uC720","DEBT":"87.75","BYE":"113.63","SALES":"644.24","EPSRATE":"\uC801\uC9C0","ROA":"-0.40","ROE":"-0.88","EPS":"-9","BPS":"1,068","PER":"N\/A","PBR":"0.77","EV/EBITDA":"23.64","GICODE":"A015020"},{"RANK":4,"name":"\uD0A4\uC704\uBBF8\uB514\uC5B4\uADF8\uB8F9","결산년월":"201712","시장":"\uC720","DEBT":"113.14","BYE":"N\/A","SALES":"499.78","EPSRATE":"\uC801\uC9C0","ROA":"-35.96","ROE":"-59.96","EPS":"-237","BPS":"333","PER":"N\/A","PBR":"2.17","EV/EBITDA":"N\/A","GICODE":"A012170"},{"RANK":5,"name":"\uBBF8\uB798\uC5D0\uC14B\uB300\uC6B0","결산년월":"201712","시장":"\uC720","DEBT":"675.19","BYE":"119.56","SALES":"320.83","EPSRATE":"668.21","ROA":"0.75","ROE":"6.06","EPS":"624","BPS":"10,978","PER":"14.40","PBR":"0.82","EV/EBITDA":"","GICODE":"A006800"},{"RANK":6,"name":"\uC2E0\uC131\uC774\uC5D4\uC9C0","결산년월":"201712","시장":"\uC720","DEBT":"679.38","BYE":"75.78","SALES":"319.30","EPSRATE":"\uC801\uC804","ROA":"-7.07","ROE":"-43.63","EPS":"-267","BPS":"880","PER":"N\/A","PBR":"2.18","EV/EBITDA":"66.88","GICODE":"A011930"},{"RANK":7,"name":"BGF","결산년월":"201712","시장":"\uC720","DEBT":"8.93","BYE":"1,891.81","SALES":"213.95","EPSRATE":"2,125.44","ROA":"291.44","RO

E":"470.86","EPS":"75,182","BPS":"19,918","PER":"0.20","PBR":"0.77","EV/EBITDA":"5.61","GICODE":"A027410"},{"RANK":8,"name":"\uD604\uB300\uC5D0\uC774\uCE58\uC528\uC5D4","결산년월":"201712","시장":"\uC720","DEBT":"9.69","BYE":"1,088.78","SALES":"188.00","EPSRATE":"329.42","ROA":"6.02","ROE":"6.60","EPS":"375","BPS":"5,944","PER":"10.52","PBR":"0.66","EV/EBITDA":"5.49","GICODE":"A126560"}]  


이런 식을 되어 있습니다. 


이러한 배열 에서  GICODE 를 파싱하겠습니다. 


먼저 웹 프로토콜을 사용하기 위해서 


pro 파일에  


QT += network


network 을 추가해 줍니다. 


그리고 


#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QUrl>
#include <QNetworkRequest>
#include <QDebug>
#include <QEventLoop>
#include <QJsonDocument>
#include <QJsonValue>
#include <QJsonArray>

#include <QJsonObject>


위와 같은 해더가 파일에 추가되어야 합니다. 


이중 JSON에 관련된것은 QJsonDocument,QJsonValue,QJsonArray,QJsonObject  


4가지 입니다. 


나머지는 웹페이지를 사용하기 위한 헤더 입니다. 




그뒤에 웹페이지를 사용하기 위해서 



여기서 QNetworkAccessManager 은 웹페이지를 사용하기 위함이고  


QEventLoop 는 동기화를 위해서입니다.  >> QNetworkAccessManager 웹페이지를 호출하게 되면 이벤트로써 데이터 수신 완료 신호를 받기 때문에 동기화 프로그램을 위해서는 위해 해당 객체가 필요 합니다. 



cpp 파일에 


    manager = new QNetworkAccessManager(this);

    connect(manager, SIGNAL( finished(QNetworkReply*) ), &connection_loop, SLOT( quit() ) );

 

추가 해 줍니다 ..


이렇게 되면  웹페이지 수신 완료 신호를 받으면 QeventLoop 의 quit() 메소드를 실행 시켜 줍니다 .


그리고 나서 json 파싱 샘플 코드 입니다. 




void infomation_fund1::on_fund1_make_btn_clicked()
{
    QNetworkRequest request;
    request.setUrl(QUrl("http://comp.fnguide.com/SVO2/common/sp_read_json.asp?cmdText=menu_6_2&IN_U_CD=I.001&IN_MARKET_GB=&IN_REPORT_GB=A&IN_SORT=9"));
    QNetworkReply *reply = manager->get(request);
    connection_loop.exec();
    QByteArray data = reply->readAll();
    QJsonDocument json_doc = QJsonDocument::fromJson(data);
    foreach (QJsonValue var, json_doc.array()) {
        QString GICODE = var.toObject().value("GICODE").toString();
        qDebug()<<GICODE;
    }

}


코드를 보면 connection_loop.exec();  

이부분이 동기화를 위한 부분 입니다. 



    QByteArray data = reply->readAll();
    QJsonDocument json_doc = QJsonDocument::fromJson(data);
    foreach (QJsonValue var, json_doc.array()) {
        QString GICODE = var.toObject().value("GICODE").toString();
        qDebug()<<GICODE;
    }


그리고 이부분이 json 파싱 부분 입니다. 



Comments