RapidJson NEXT 김명찬.

Slides:



Advertisements
Similar presentations
3. 자료형. 담당교수 : 이 성 우 C++ 프로그래밍 상수와 변수 (3) 1. 변수 (variable)  프로그램 수행 도중에 자료  변수를 위해 은 변하지 않음  선언 시에 반드시 그. ※ 저장 정보의 구성 ① 정보의 종류 ② 저장 값 ③ 저장 위치 int Num.
Advertisements

National University 1 / 17 컴퓨터 개론 및 실습 강의 6.
스택 스택 추상자료형 스택 스택의 구현 스택의 응용 한빛미디어(주).
Chapter 02. C언어 기반의 C++ 박 종 혁 교수 UCS Lab SeoulTech Tel:
Vision System Lab, Sang-Hun Han
제 3 장 변수와 자료형.
C++ Tutorial 1 서강대학교 데이터베이스 연구실.
Power C++ 제6장 포인터와 문자열.
C++ Espresso 제3장 배열과 포인터.
C++ Espresso 제3장 배열과 포인터.
C++ Espresso 제1장 기초 사항.
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express.
데이터 관리의 모든 것 데이터 최적화하기 데이터 정렬하기 자동 필터와 고급 필터
쉽게 풀어쓴 C언어 Express 제13장 구조체 C Express Slide 1 (of 25)
강좌명 : C++프로그래밍 (C++ Programming)
시스템 생명 주기(System Life Cycle)(1/2)
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
제6장 객체배열과 벡터 객체 배열을 이해한다. 벡터(vector) 클래스를 사용할 수 있다.
쉽게 풀어쓴 C언어 Express 제17장 동적 메모리와 연결 리스트 C Express.
시스템 생명 주기(System Life Cycle)(1/2)
쉽게 풀어쓴 C언어 Express 제4장 변수와 자료형 C Express.
10장 템플릿과 표준 템플릿 라이브러리(STL)
제15장 STL과 람다식 STL의 개념을 이해하고 사용할 수 있다. 람다식을 이해하고 사용할 수 있다.
연산자 대입 연산자 산술 연산자 관계 연산자 논리 연산자 비트 연산자 콤마 연산자 축약 연산자 sizeof 연산자
쉽게 풀어쓴 C언어 Express 제17장 동적 메모리와 연결 리스트 C Express.
쉽게 풀어쓴 C언어 Express 제17장 동적메모리와 연결리스트 C Express.
동적메모리와 연결리스트 컴퓨터시뮬레이션학과 2016년 봄학기 담당교수 : 이형원 E304호,
3장. 포인터, 배열, 구조체 포인터, 배열, 구조체 학습목표 기본적 데이터 타입
명품 Java Programming.
XML DOM (Document Object Model)
14장. 함수 1 01_ 함수의 기본 02_ 인자의 전달.
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
Chapter 05. 클래스 완성. chapter 05. 클래스 완성 01. 복사 생성자 복사 생성(Copy Construction) 생성될 때 자신과 같은 타입의 객체를 변수로 받아, 이 객체와 같은 값을 갖는 새로운 객체를 생성하는 것 명시적인 생성 과정뿐만.
C ++ 프로그래밍 시작.
Chapter 1 C++ 기초 Copyright © 2010 Pearson Addison-Wesley. All rights reserved.
프로그래밍2 및 실습 C언어 기반의 C++ 2.
스택(Stack) 김진수
17장. 문자열 01_ 문자열 사용의 기본 02_ 문자열의 사용.
쉽게 풀어쓴 C언어 Express 제4장 변수와 자료형 C Express.
5장. 상수와 기본 자료형. 5장. 상수와 기본 자료형 5-1 C 언어가 제공하는 기본 자료형 자료형(data type) 기본 자료형 사용자 정의 자료형 int val; "선언할 변수의 특징을 나타내기 위한 키워드" 기본 자료형 기본적으로 제공이 되는 자료형 사용자.
쉽게 풀어쓴 C언어 Express 제4장 변수와 자료형 C Express.
adopted from KNK C Programming : A Modern Approach
추상 데이터 타입 정의하기 Defining abstract data types
컴퓨터의 기초 제 2강 - 변수와 자료형 , 연산자 2006년 3월 27일.
제 6장 함수 Hello!! C 언어 강성호 김학배 최우영.
타입, 연산자 Chapter 5, 6 Kum Deuk Kyu , Ph. D. Spring 2015
Chapter 1 C와는 다른 C++. 최호성.
인터넷응용프로그래밍 JavaScript(array).
제2장 제어구조와 배열 if-else 문에 대하여 학습한다. 중첩 if-else 문에 대하여 학습한다.
제 2장 어휘구조와 자료형 토 큰 리 터 럴 주 석 자 료 형 배 열 형.
Java의 정석 제 2 장 변수(Variable) Java 정석 남궁성 강의
제 12장. 사용자 정의형으로서의 클래스 학기 프로그래밍언어및실습 (C++).
4장 - PHP의 표현식과 흐름 제어-.
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
제 4장. 객체 지향 프로그래밍 시작하기 학기 프로그래밍언어및실습 (C++).
8 기본 내장 객체.
루프와 카운트 Looping and counting
문자열 처리하기 working with Strings
C언어 (8) 정명희.
제 11장. 템플릿과 STL 학기 프로그래밍언어및실습 (C++).
03. 메모리 관리 C++ 프로그램에서 다룰 수 있는 메모리의 종류
자바 5.0 프로그래밍.
박성진 컴퓨터 프로그래밍 기초 [03] 변수와 자료형 박성진
개정판 누구나 즐기는 C언어 콘서트 제10장 문자열 출처: pixabay.
17장. 포인터의 포인터.
윤성우의 열혈 C++ 프로그래밍 윤성우 저 열혈강의 C++ 프로그래밍 개정판 Chapter 02. C언어 기반의 C++ 2.
배열, 포인터, 함수 Review & 과제 1, 2.
PHP 기초문법 PHP를 공부하는데 있어 가장 기초가 되는 PHP기초문법에 대해서 배워 봅니다.
Python 기본.
배열.
Presentation transcript:

RapidJson NEXT 김명찬

RapidJson 수 많은 C++ 용 Json library 중 하나. (JsonCpp와 비교하여) 더 작고 더 빠르고 더 가벼움. DOM(document object model) 객체로 만들어 다룸. 다소 헤더파일이 많음. (75KB vs 586KB)

RapidJson Json 호환성 테스트 높을 수록 좋음.

RapidJson String -> 객체 파싱 속도 작을수록 좋음

RapidJson 메모리 사용량 작을수록 좋음 strdup는 string자체를 의미

RapidJson 객체 -> string 바꾸는데 걸린 시간 작을수록 good

RapidJson 들여쓰기와 newline 만들기 걸린 시간 작을수록 good

RapidJson 컴파일된 바이너리의 크기 작을수록 good

RapidJson 자랑은 이정도 하고..

RapidJson - 설치법 https://github.com/miloyip/rapidjson/ Include 폴더의 내용을 본인 Include 폴더에 복사하면 끝. #include "rapidjson/document.h" using namespace rapidjson;

RapidJson – 기본 사용. root 는 오브젝트로 생성됨. Value 클래스로 모든값이 저장됨. #include "rapidjson/document.h" using namespace rapidjson; char json[] = ... Document document; document.Parse(json); char json[] = R"( { "hello": "world", "t" : true, "f" : false, "n" : null, "i" : 123, "pi" : 3.1416, "a" : [1, 2, 3, 4] })";

RapidJson – 기본 사용. root 는 오브젝트로 생성됨. Value 클래스로 모든값이 저장됨.

RapidJson - string char json[] = R"( { "hello": "world", "t" : true, "f" : false, "n" : null, "i" : 123, "pi" : 3.1416, "a" : [1, 2, 3, 4] })"; Document document; document.Parse(json); assert(document.IsObject()); assert(document.HasMember("hello")); assert(document["hello"].IsString() == true); sprintf(json, "%s", document["hello"].GetString()); MultiByteToWideChar(CP_ACP, 0, json, -1, temp, strlen(json)); TextOut(memoryDC, 10, 10, temp, lstrlen(temp));

RapidJson - bool char json[] = R"( { "hello": "world", "t" : true, "f" : false, "n" : null, "i" : 123, "pi" : 3.1416, "a" : [1, 2, 3, 4] })"; Document document; document.Parse(json); assert(document["t"].IsBool()); assert(document["t"].GetBool() == true); sprintf(json, "%s", document["t"].GetBool() ? "True" : "False"); MultiByteToWideChar(CP_ACP, 0, json, -1, temp, strlen(json)); TextOut(memoryDC, 10, 10, temp, lstrlen(temp));

RapidJson - null char json[] = R"( { "hello": "world", "t" : true, "f" : false, "n" : null, "i" : 123, "pi" : 3.1416, "a" : [1, 2, 3, 4] })"; Document document; document.Parse(json); assert(document["n"].IsNull() == true); sprintf(json, "%s", document["n"].IsNull() ? "True" : "False"); MultiByteToWideChar(CP_ACP, 0, json, -1, temp, strlen(json)); TextOut(memoryDC, 10, 10, temp, lstrlen(temp));

RapidJson - number char json[] = R"( { "hello": "world", "t" : true, "f" : false, "n" : null, "i" : 123, "pi" : 3.1416, "a" : [1, 2, 3, 4] })"; Document document; document.Parse(json); assert(document["i"].IsNumber()); // In this case, IsUint()/IsInt64()/IsUInt64() also return true. assert(document["i"].IsInt()); // Alternative (int)document["i"] assert(document["pi"].IsNumber()); assert(document["pi"].IsDouble());

RapidJson - array char json[] = R"( { "hello": "world", "t" : true, "f" : false, "n" : null, "i" : 123, "pi" : 3.1416, "a" : [1, 2, 3, 4] })"; Document document; document.Parse(json); assert(document["a"].IsArray()); // Using a reference for consecutive access // is handy and faster. const Value& a = document["a"]; assert(a.IsArray()); for (SizeType i = 0; i < a.Size(); i++) // Uses SizeType instead of size_t { char tmpJson[50]; sprintf(tmpJson ,"a[%d] = %d ", i, a[i].GetInt()); strcat(json, tmpJson); }

RapidJson - array for (SizeType i = 0; i < a.Size(); i++) // Uses SizeType instead of size_t { char tmpJson[50]; sprintf(tmpJson ,"a[%d] = %d ", i, a[i].GetInt()); strcat(json, tmpJson); } for (auto itr = a.Begin(); itr != a.End(); ++itr) { char tmpJson[50]; sprintf(tmpJson, "%d ", itr->GetInt()); strcat(json, tmpJson); } SizeType Capacity() const bool Empty() const

RapidJson – typename(enum) static const char* kTypeNames[] = { "Null", "False", "True", "Object", "Array", "String", "Number" }; sprintf(json, "%s", kTypeNames[a.GetType()]); auto tmp = a.GetType(); //typename을 확인하고 싶다면.. auto 위에 마우스 커서를... sprintf(json, "%s", kTypeNames[tmp]); Enum으로 처리됩니다! bool 대신 False, True가 있는 것이 특이하네요..

RapidJson - 검색 auto itr = document.FindMember("hello"); if (itr != document.MemberEnd()) // End() means cannot find sprintf(json, "%s ", itr->value.GetString());

RapidJson - Number JSON은 Number라는 단독 타입으로 숫자를 넘김. 파서가 각 값들의 타입을 결정한다. Checking Obtaining bool IsNumber() N/A bool IsUint() unsigned GetUint() bool IsInt() int GetInt() bool IsUint64() uint64_t GetUint64() bool IsInt64() int64_t GetInt64() bool IsDouble() double GetDouble()

RapidJson – Number 예를들어 x = 123 x = -3,000,000,000 x.IsInt() == x.IsUint() == x.IsInt64() == x.IsUint64() == true x.IsInt64() == true

RapidJson – string length 예 이 문자열의 길이는 3 입니다. ( ‘a’, ‘\u0000’, ‘b’ ) strlen을 하면 1로 나옵니다. ( \u0000을 null로 인식 ) GetStringLength() 를 사용하면 3이 나옴. alloc한 문자열에서는 성능 향상도 있음. { "s" : "a\u0000b" }

RapidJson - comparision Value 클래스에 != , == 사용 가능 if (document["hello"] == document["n"]) /*...*/; // Compare values if (document["hello"] == "world") /*...*/; // Compare value with literal string if (document["i"] != 123) /*...*/; // Compare with integers if (document["pi"] != 3.14) /*...*/; // Compare with double.

RapidJson – modifying DOM Document d; // Null d.SetObject(); Value v; // Null v.SetInt(10); v = 10; // Shortcut, same as above Value b(true); // calls Value(bool) Value i(-123); // calls Value(int) Value u(123u); // calls Value(unsigned) Value d(1.5); // calls Value(double)

RapidJson - modifying DOM 빈값 생성 Value v; //기본 생성자로 생성한 후에 v.SetObject(); // 빈 Object로 변환함 v.SetArray(); // 빈 Array로 변환함

RapidJson – move sementics!!! 엄청 중요 헐… 속도 때문임. 큰 Object 복사할때는 시간이 겁나 걸린대요. 깊은 복사는 뒤에서 다룹니다. Value a(123); Value b(456); a = b; // b -> Null value, a -> number 123.

RapidJson – create string Document document; Value author; char buffer[10]; int len = sprintf(buffer, "%s %s", "Milo", "Yip");  // 문자열 동적 생성 author.SetString(buffer, len, document.GetAllocator()); memset(buffer, 0, sizeof(buffer)); // author.GetString()는 아직 버퍼가 파괴된 이후에도  // "Milo Yip"를 포함한다.

RapidJson – create string 얕은복사? – 안됨. const char * cstr = getenv("USER"); size_t cstr_len = ...; // 여기서 길이를 측정한다. Value s; // s.SetString(cstr); // 컴파일 되지 않는다. s.SetString(StringRef(cstr)); // ok, 널문자열이며 생명주기가 보장된다. s = StringRef(cstr); // 위와 같다. s.SetString(StringRef(cstr,cstr_len)); // 빠르고, 널 문자열을 포함한다. s = StringRef(cstr,cstr_len); // 위와 같다.

RapidJson – modifying Array Clear() Reserve(SizeType, Allocator&) Value& PushBack(Value&, Allocator&) template <typename T> GenericValue& PushBack(T, Allocator&) Value& PopBack() ValueIterator Erase(ConstValueIterator pos) ValueIterator Erase(ConstValueIterator first, ConstValueIterator last)

RapidJson – modifying Array Value a(kArrayType); Document::AllocatorType& allocator = document.GetAllocator(); for (int i = 5; i <= 10; i++) a.PushBack(i, allocator); // allocator is needed for potential realloc(). a.PushBack("Lua", allocator).PushBack("Mio", allocator);

RapidJson – modify object Value contact(kObject); contact.AddMember("name", "Milo", document.GetAllocator()); contact.AddMember("married", true, document.GetAllocator());

RapidJson – Deep Copy 깊은복사 Document d; Document::AllocatorType& a = d.GetAllocator(); Value v1("foo"); // Value v2(v1); // 허용하지 않는다 Value v2(v1, a); // 카피를 만든다. assert(v1.IsString()); // v1은 문자열이었는데… d.SetArray().PushBack(v1, a).PushBack(v2, a); assert(v1.IsNull() && v2.IsNull()); // 둘다 d로 이동 v2.CopyFrom(d, a); // 전체 도큐먼트를 v2로 카피 assert(d.IsArray() && d.Size() == 2); // d는 손대지 않았다. v1.SetObject().AddMember("array", v2, a); d.PushBack(v1, a);

RapidJson – swap value Value a(123); Value b("Hello"); a.Swap(b); assert(a.IsString()); assert(b.IsInt());

RapidJson 감사합니다. 참고자료 https://github.com/miloyip/rapidjson/ http://miloyip.github.io/rapidjson/md_doc_tutorial.html http://postgame.tistory.com/558