본문 바로가기
C++ 200제/코딩 IT 정보

Qt Json, 만들기, 읽기, 쓰기, 수정, 예제 파싱 소스

by vicddory 2017. 6. 4.

Qt Json, 만들기, 읽기, 쓰기, 수정하기 예제 파싱 소스


이 포스트에선 Qt에서 JSON 파일을 만들기, 읽기, 쓰기, 수정하는 4가지 기능을 다룹니다. 함수는 각각 Make(), Read(), Write(), Modify()입니다.


일단 QJson 전체 소스부터 하나씩 살펴보겠습니다.


Header



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#ifndef JSONCONTROLLER_H
#define JSONCONTROLLER_H
 
#include <QFile>
 
#include <QJsonObject>
#include <QJsonDocument>
#include <QJsonArray>
 
class JSONController
{
    static const QString kFileExam;
 
public:
    JSONController();
    ~JSONController();
 
public:
    void Modify(const QByteArray &info);
    void Make(); // 파일이 없으면 생성
    void Read(); // 파일을 읽어 멤버변수에 값 대입
    void Write();
    void Open(const int idx, const bool is_write = false);
 
private:
    QJsonObject title_;
    QJsonObject body1_; // body
    QJsonObject body2_;
    QJsonDocument doc_; // WRITE 용도
    QFile file_;
};
 
#endif // JSONCONTROLLER_H
cs


굵게 표시된 25번 라인부터 살펴보죠.


json 내부의 항목을 편집할 때 사용할 변수들입니다. json 트리 단계와 관계없이 모든 항목은 QJsonObject를 이용합니다.

QJsonObject들이 담을 내용은 QJsonDocument를 통해 획득합니다.

exam.json



1
2
3
4
5
6
7
8
9
{
    "body1": {
        "tree1": "null"
    },
    "body2": {
        "tree2_1": "null",
        "tree2_2": "null"
    }
}
cs


위와 같은 json 파일이 있다고 가정합니다.


QJsonObject title_ - body1과 body2를 보유한 변수

QJsonObject body1_ - tree1을 보유한 변수

QJsonObject body2_ - tree2_1과 tree2_2를 보유한 변수

QJsonDocument doc_ - title_를 보유한 변수


QFile 객체가 실제 json 파일을 생성할 때 doc_ 변수의 내용을 이용합니다. 즉, doc_ 변수의 내용이 실제 json 파일의 내용과 같은 것입니다.


중심이 되는 변수는 살펴봤고, 이제 CPP 파일의 구현 부를 설명합니다.


Qt Json, 만들기, 읽기, 쓰기, 수정, 예제 파싱 소스[C++ Qt] Json Example Parsing


Cpp Open()



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void JSONController::Open(const int idx, const bool is_write)
{
    if (idx == 0)
            file_.setFileName(kFileExam);
    else { }
        // something...
 
    is_write == true ?
        file_.open(QIODevice::ReadWrite | QIODevice::Truncate)
        : file_.open(QIODevice::ReadWrite);
 
    // JSON 내용을 모두 읽어 JSON Doc 형태로 변환
    QByteArray load_data = file_.readAll();
    doc_ = QJsonDocument::fromJson(load_data);
}
cs


기본이 되는 Open() 함수엔 두 가지 인자가 존재합니다. idx는 파일의 경로를 뜻합니다. 저는 kFileExam이란 상수를 하나 만들었는데 용도에 따라 편집해 사용하시면 됩니다(QString 타입).


is_write는 파일의 읽기와 갱신을 구분해 줍니다. 뒤에도 언급하겠지만, Modify() 함수는 json의 내용을 수정하는 함수입니다.

이 경우, 기존의 내용은 지우고 새로운 내용을 채워야 하기에 기존의 내용을 지우겠다는 Truncate 옵션을 선택해야 합니다.

대부분 변수를 멤버 함수로 분리해 코드 중복을 막으려는 조치 중 하나입니다.


13번 라인에선 json 내부의 항목들을 읽어 QByteArray 형태로 먼저 저장합니다.

14번 라인에서 그 데이터들을 json 형태로 변환하여 QJsonObject 변수인 doc_로 전달합니다.


여기까지 진행되면 doc_를 중심으로 json 항목들을 편집/추가할 수 있습니다.


Cpp 생성자



1
2
3
4
5
6
7
8
9
10
const QString JSONController::kFileExam = "exam.json";
 
JSONController::JSONController()
{
     // JSON 파일 유무 확인
    if (QFile::exists(kFileExam) == false)
        Make(); // 없으면 생성
 
    Read();
}
cs


QJson 생성자에서는 QFile()의 exists() 함수를 이용해 파일의 유무를 먼저 파악합니다.


파일이 존재하지 않으면 임의의 값이 담긴 json 파일을 생성합니다.


QJson C++ Json 파싱 예제[C++ Qt] Json Example Parsing


Cpp Make()



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void JSONController::Make()
{
    Open(0);
 
    // Tree Depth 2 - 세부 내용
    body1_["tree1"= "null";
 
    body2_["tree2_1"= "null";
    body2_["tree2_2"= "null";
 
    // Tree Depth 1 - 제목
    title_["body1"= body1_;
    title_["body2"= body2_;
 
    Write();
}
cs


Make() 함수는 없는 파일을 새로 생성하는 함수입니다.


Open() 함수에 인자로 0만 전달되면 파일을 Read/Write 모드로 읽어 들입니다. 위에서 설명한 QJsonObject 변수들에 값을 대입하고 Write() 함수를 호출합니다.

Cpp Write()



1
2
3
4
5
6
7
void JSONController::Write()
{
    // .JSON 파일에 쓰기
    doc_.setObject(title_);
    file_.write(doc_.toJson());
    file_.close();
}
cs


Make() 함수에서 title_ 변수에 json 항목들을 이미 추가해 두었습니다. 이 내용을 doc_ 변수에 담습니다. QFile 객체인 file_ 변수는 doc_의 내용을 파일로 생성합니다.


여기까지가 json 파일이 존재하지 않으면 새롭게 파일을 생성하는 과정이 되겠습니다. 언급하지 않은 다른 함수들을 살펴보죠.


Cpp Read()



1
2
3
4
5
6
7
8
9
10
void JSONController::Read()
{
    Open(0);
 
    // 파일의 내용을 읽어 변수에 대입
    body1_ = doc_.object()["body1"].toObject();
    body2_ = doc_.object()["body2"].toObject();
 
    file_.close();
}
cs


Read() 함수에선 이미 파일에서 읽힌 항목들을 QJsonObject 변수들에 담습니다.


각 괄호 안의 이름과 json 파일의 이름이 같아야 정상 구동이 됩니다.


Cpp Modify()



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void JSONController::Modify(const QByteArray &info)
{
    Open(0true);
 
    body1_["tree1"= "first";
 
    body2_["tree2_1"= "2_1";
    body2_["tree2_2"= "2_2";
 
    // Tree Depth 1 - 제목
    title_["body1"= body1_;
    title_["body2"= body2_;
 
    Write();
}
cs


QJson Modify() 함수는 json 항목을 수정할 때 사용합니다. Open() 함수에 인자로 0과 true를 넘깁니다. 파일을 불러올 때, Truncate 옵션이 붙으니 json 파일을 읽은 후 해당 파일의 내용은 모두 삭제됩니다.


빨간색 라인처럼 일부 내용을 변경합니다. 그리고 Write() 함수를 호출하면 갱신된 내용이 적용된 새로운 json 파일이 생성됩니다.


ps. Qt에선 'JSON Save Game Example'란 페이지를 통해 예제를 소개하고 있지만, 이해하기엔 조금 어렵습니다.


Qt Json, 만들기, 읽기, 쓰기, 수정하기 예제 파싱 소스

댓글