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 |