rapidjson

C++¿¡¼­ json ÆÄÀÏÀ» ºü¸£°Ô ÀÐ°í ¾µ¼ö ÀÖ´Â rapidjson¿¡ ´ëÇؼ­ ¾Ë¾Æº»´Ù.
rapidjsonÀº ¼Óµµ´Â ºü¸£Áö¸¸ À߸øµÈ json ±¸¹®¿¡ ´ëÇؼ­´Â °¡Â÷¾øÀÌ assert¸¦ ¶ç¿î´Ù.
rapidjson ÀÚü¿¡µµ ¿¹Á¦°¡ ¸¹Áö¸¸ ´õ °£´ÜÇÑ ¿¹Á¦°¡ ÇÊ¿äÇؼ­ »õ·Î ¸¸µé¾ú´Ù.

½ÇÇàÀº ºñÁÖ¾ó½ºÆ©µð¿À 2010¿¡¼­ ÇÏ¿´´Ù.
rapidjsonÀº Çì´õ ÆÄÀÏ·Î ÀÌ·ïÁ® Àֱ⠶§¹®¿¡ ¶óÀ̺귯¸®³ª Ưº°ÇÑ ¼³Á¤ÀÌ ÇÊ¿ä ¾ø´Ù.
Çì´õ ÆÄÀϸ¸ Æ÷ÇÔ½ÃÅ°¸é ½ÇÇàÀÌ µÈ´Ù.
ºñÁê¾ó ½ºÆ©µð¿À¿¡¼­ ÇÁ·ÎÁ§Æ® »ý¼ºÀº µðÆúÆ®·Î ÇÏ¿´´Ù.

¿¹Á¦1) ÆÄÀÏ Àбâ

MyTest1.cpp ÆÄÀÏ
#include "rapidjson/filereadstream.h"
#include "rapidjson/document.h"
#include <stdio.h>
#include <iostream>
#include <cstdio>

using namespace rapidjson;
using namespace std;
void main()
{
    FILE* fp = fopen("mytest.json", "rb"); // non-Windows use "r"
    const int bufferLength = 65536;
    char readBuffer[bufferLength] = {0,};
#if 0
    //RapidJsonÀÇ FileReadStreamÀ» ÀÌ¿ëÇؼ­ ¹öÆÛ¸¦ Àд´Ù.
    FileReadStream is(fp, readBuffer, sizeof(readBuffer));
    Document doc;
    doc.ParseStream(is);
    fclose(fp);
#else
    size_t fileSize = fread(readBuffer, 1, bufferLength, fp);
    fclose(fp);
    Document doc;
    doc.Parse(readBuffer);
#endif

    if(doc.HasMember("name"))
    {
        Value& v = doc["name"];
        cout << "name: " << v.GetString() << endl;
        cout << "age: " << doc["age"].GetInt() << endl;

        cout << "arr: ";
        const rapidjson::Value& arr = doc["arr"];
        for (SizeType i =  0; i < arr.Size(); i++)
        {
            cout << arr[i].GetInt() << "  ";
        }
        cout << endl;
    }
}

mytest.json ÆÄÀÏ
{
    "name": "È« ±æµ¿",
    "age": 32,
    "arr": [1, 2, 3, 4]
}

°á°ú)
name: È« ±æµ¿
age: 32
arr: 1  2  3  4

DocumentÀÇ Parse ÇÔ¼ö¿¡ ¹®ÀÚ¿­À» ³Ö¾îÁÖ¸é json ±¸¹® ÆĽÌÀ» ÇÑ´Ù.
Document doc;
doc.Parse(readBuffer);

ÆĽÌÀÌ µÇ¸é »ç¿ëÀº stdÀÇ Çؽ¬Ã³·³ °ªÀ» °¡Á® ¿Ã¼ö ÀÖ´Ù.
doc["age"].GetInt();
°ªÀ» ÀÐ¾î ¿À´Â ÇÔ¼ö´Â GetInt, GetFloat, GetDouble, GetString, GetBoolµîÀÌ ÀÖ´Ù.

´ÙÀ½ ¶óÀÎÀº ¹è¿­À» ÀÐ¾î ¿À´Â ¹æ¹ý¿¡ ´ëÇؼ­ ¼³¸íÇÏ°í ÀÖ´Ù.
const rapidjson::Value& arr = doc["arr"];

»ç¿ë ¹æ¹ýÀº ¾î·ÆÁö ¾Ê´Ù.  º¹ÀâÇØÁö´Â json¿¡ ´ëÇؼ­ °ªÀ» ¾î¶»°Ô ÀÐ¾î ¿À´ÂÁö ¾Ë¾Æ º¸ÀÚ.


¿¹Á¦ 2) ·çÆ®°¡ ¹è¿­ÀÎ ÆÄÀÏ Àбâ

mytest_arr.json ÆÄÀÏ
[
    {
        "name": "Hong Gil Dong",
        "age": 32
    },
    {
        "name": "Kimg Sang Ho",
        "age": 37
    }
]

MyTest2.cpp
#include "rapidjson/filereadstream.h"
#include "rapidjson/document.h"
#include <fstream>
#include <stdio.h>
#include <iostream>
#include <string>
#include <cctype>
#include <cstdio>

using namespace rapidjson;
using namespace std;

void main()
{
    FILE* fp = fopen("mytest_arr.json", "rb"); // non-Windows use "r"
    char readBuffer[65536];
    FileReadStream is(fp, readBuffer, sizeof(readBuffer));
    Document doc;
    doc.ParseStream(is);
    fclose(fp);

    if(doc.IsArray())
    {
        cout << "is array  " << doc.Size() << endl;
        for (SizeType i =  0; i < doc.Size(); i++)
        {
            Value& v = doc[i];
            cout << "name:  " << v["name"].GetString() << endl;
        }
    }
}

°á°ú)
is array  2
name:  Hong Gil Dong
name:  Kimg Sang Ho

·çÆ®°¡ ¹è¿­ÀÎ °æ¿ì¿¡´Â doc.Size()·Î ¹è¿­ÀÇ Å©±â¸¦ ±¸ÇÑÈÄ °¢ ³ëµåÀÇ °ªÀ» °¡Á®¿Â´Ù.

¿¹Á¦3) ÁÖ¼® üũÇϱâ

MyTest3.cpp ÆÄÀÏ
#include "rapidjson/filereadstream.h"
#include "rapidjson/document.h"
#include <fstream>
#include <stdio.h>
#include <iostream>
#include <string>
#include <cctype>
#include <cstdio>

using namespace rapidjson;
using namespace std;

static inline void ltrim_string(std::string &s)
{
    int fisrt_non_space = 0;
    for (int i = 0; i < s.size(); i++)
    {
        if (!std::isspace(s[i]))
        {
            fisrt_non_space = i;
            break;
        }
    }
    s = s.substr(fisrt_non_space);
}

std::string ParseFile(const std::string &file)
{
    std::ifstream f(file.c_str());
    if (!f.is_open())
    {
        cout << "Open json file failed." << endl;
        return "";
    }
    std::string content;
    std::string line;
    while (std::getline(f, line))
    {
        ltrim_string(line);
        if (line.find("//") == 0 || line.find("#") == 0)
        {
            continue;
        }
        content.append(line);
    }
    return content;
}

void main()
{
    std::string content = ParseFile("mytest_coment.json");
    Document doc;
    rapidjson::ParseResult bParseok = doc.Parse(content.c_str(), content.size());
    if (bParseok.IsError())
    {
        cout << "parse error !!!" << endl;
        return;
    }

    if(doc.IsArray())
    {
        cout << "is array  " << doc.Size() << endl;
        for (SizeType i =  0; i < doc.Size(); i++)
        {
            Value& v = doc[i];
            cout << "name:  " << v["name"].GetString() << endl;
        }
    }
}

mytest_coment.json ÆÄÀÏ
[
//¿©±â´Â ·çÆ®
    {
    //name: À̸§, age: ³ªÀÌ
        "name": "Hong Gil Dong",
        "age": 32
    },
    {
        "name": "Kimg Sang Ho",
        "age": 37
    }
]

ÁÖ¼® 󸮴 RapidJson¿¡¼­ ó¸® ÇØÁÖÁö ¾Ê´Â´Ù. '#'À̳ª '//' ¹®ÀÚ°¡ ÀÖÀ¸¸é ÆÄ½Ì ¿¡·¯°¡ ¹ß»ýÇÑ´Ù.
¿©±â¼­´Â ÇÑÁÙ¾¿ ÀÐÀ»¶§ '#'À̳ª '//' ¹®ÀÚ°¡ ÀÖÀ¸¸é ÁÖ¼®À¸·Î ó¸®ÇÑ´Ù.
ÁÖ¼® ¶óÀο¡´Â ÁÖ¼®¸¸ ÀÖ¾î¾ß ÇÑ´Ù. ´Ù¸¥ json ±¸¹®ÀÌ ÀÖÀ¸¸é ¿¡·¯°¡ ¹ß»ýÇÑ´Ù.

¿¹Á¦4) ÀÚ½Ä ³ëµå ó¸®

MyTest4.cpp
#include "rapidjson/filereadstream.h"
#include "rapidjson/document.h"
#include <fstream>
#include <stdio.h>
#include <iostream>
#include <string>
#include <cctype>
#include <cstdio>

using namespace rapidjson;
using namespace std;

void main()
{
    FILE* fp = fopen("mytest_child.json", "rb"); // non-Windows use "r"
    char readBuffer[65536];
    FileReadStream is(fp, readBuffer, sizeof(readBuffer));
    Document doc;
    doc.ParseStream(is);
    fclose(fp);

    if(doc.HasMember("name"))
    {
        Value& v = doc["name"];
        cout << "last name: " << v["last"].GetString()  << endl;
        cout << "age: " << doc["age"].GetInt() << endl;
        cout << endl;
    }

    cout << "full name: " << doc["name"]["last"].GetString() 
                          << doc["name"]["first"].GetString()
                          << endl;
}

mytest_child.json
{
    "name":
     {
        "first": "GilDong",
        "last" : "Hong"
     },
    "age": 32
}

°á°ú)
last name: Hong
age: 32

full name: HongGilDong

ÀÚ½Ä ³ëµå¸¦ ó¸®ÇÏ´Â ¹æ¹ýÀº 2°¡ÁöÀÌ´Ù.
1)  ÀÚ½ÄÀ̸§±îÁö ³ëµå À̸§À» ÀûÀ¸¸é µÈ´Ù.
name = doc["name"]["last"].GetString();

2)ºÎ¸ð ³ëµå¸¦ ±¸ÇÏ°í ÀÚ½Ä ³ëµå¸¦ ±¸ÇÑ´Ù.
Value& v = doc["name"];
name = v["last"].GetString();

RapidJson¿¡¼­ ÆÄÀÏÀ» Àо ÆĽÌÇÏ´Â ¹æ¹ý¿¡ ´ëÇؼ­ ¾Ë¾Æ º¸¾Ò´Ù.

´Ù¿î·Îµå : rapidjson_demo.zip

Âü°í)
https://qiita.com/k2ymg/items/eef3b15eaa27a89353ab
https://github.com/yinqiwen/rapidjson_ext
http://rapidjson.org/md_doc_stream.html
http://rapidjson.org/

rapidjson print