알쓸전컴(알아두면 쓸모있는 전자 컴퓨터)
Qt json 파싱 with webpage(ajax) 간단 사용법 본문
Qt json parer 사용법
Qt 에서는 기본적으로
Json 라이브러리를 제공해 줍니다.
제가 json 으로 가져올 데이터는
위 사이트는 간단한 주식 데이터 사이트 입니다.
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 파싱 부분 입니다.
'QT' 카테고리의 다른 글
QVector QList 등등 자료 구조 메모리 리셋 qDeleteAll() (0) | 2018.07.01 |
---|---|
QPrinter for QTextEdit 예제 (0) | 2018.06.26 |
ubuntu qt 필요 라이브러리 path 설정하기 (0) | 2018.03.23 |
signal 동기화가 필요할때 (0) | 2018.03.21 |
corect.h 에러 날때. (0) | 2018.03.04 |