cocos2d-x에 쓸만한 JSON c++ lib 뭐가 있을까? rapidjson

 한참 cocos2d-x로 개발하다가 요즘은 서버 개발을 해야해서 node.js를 보고 있는 상황이죠. node.js로 만든 웹서버에 cocos2d-x로 간단한 post 정도를 처리할 수 있는 수준인데요, 잠시 넋두리 했던 것처럼 이제는 JSON이 필요한 시점이네요. 간단하게 JSON 정리부터 cocos2d-x가 c++ 기반이므로 JSON c++ lib 리서치 한 것등에 대한 내용을 정리합니다.


JSON(JavaScript Object Notation)?

 아니 이건 뭐 아직 JavaScript도 모르는데 JSON(JavaScript Object Notation, 제이슨)을 먼저 알아보네요. 물론 예전에 들어보긴 했습니다만, 이게 JavaScript 관련된 것이었다니...

 XML보다 더 인간 친화적?이고 더 가볍게 데이터를 교환해볼까?하는 목적으로 만든어진 데이터 형식? 포맷? 정도로 보면 될 듯합니다. 처음에는 인터넷 데이터 통신을 위해서 만들어진 듯 하지만, 지금은 일반 로컬에도 사용할 정도로 폭 넓게 사용중이죠.

 개발은 자바스크립트에 관련되어 있다고 자바스크립트에서만 사용하는 것은 아닙니다. 프로그래밍 언어와 플랫폼에 독립적이므로 각 언어용 모듈이 있거나 각 SDK등에 있다면 가져다 사용하면 됩니다.

 간단하게 { name : 값 } 형식으로 되어 있고 자세한 것을 위키백과 - JSON를 참고하면 될 듯합니다.


JSON C++ 리서치

 cocoa나 cocoa touch에 오브젝트C로 된 JSON 모듈, Android SDK또는 자바에 JSON 모듈이 있을법도 하지만 이런것들을 사용하면 cocos2d-x에서 jni등을 거쳐 처리해야 하므로 단계가 늘어나게되죠. 어짜피 cocos2d-x 내부에서 c++로 libcurl과 pthread를 가지고 통신이 되므로 JSON도 C/C++로 된 것을 리서치 해봤습니다.

 JSON 홈페이지 밑에 각 언어별로 지원하는 모듈들 링크가 쫙 있네요.
 이 많은걸 다 리서치 해보기는 그렇고, 고맙게도 JSON C++ lib를 비교 분석하신분들이 계시네요.
 링크 블로그 내용을 참고해보면 jsoncppJsonBox가 추천대상이네요. 하지만 가장 최근에 나온 rapidjson이 속도가 극강인 듯 합니다. 또한 링크의 뎃글중에 한국분이 만드신 minidom이라는 것도 있네요. 이건 JSON이외에도 XML, INI, NKV, HTTP header를 지원하네요.

 일단 대세?인 rapidjson을 cocos2d-x에 통합해 보겠습니다.


cocos2d-x rapidjson Integration

 먼저 rapidjson Downloads 페이지에가서 최신버전인 rapidjson-0.11.zip을 다운받습니다.

 사실 통합이라고 해봐야 별 것 없습니다. rapidjson이 h 파일로만 구성되어 있어서 그것들을 원하는 디렉터리에 복사해주면 됩니다. 왼쪽에 보이는 rapidjson\include\rapidjson 디렉터리를 cocos2d-x설치위치\external 에 복사해주면 끝이죠. 이렇게 cocos2d-x 내부 디렉터리에 해도되고, 저 처럼 따로 프로젝트 디렉터리 구성하시는 분들은 그 윗단에 마음에 드는 위치에 복사를해주면 됩니다.

 마지막으로 cocos2d-x sln 파일을 열어 HelloCpp의 프로젝트 속성-> C/C++ -> 일반 -> 추가 포함 디렉터리에 스샷과 같이 external 디렉터리를 추가합니다. 사실 TestCpp에는 이미 추가가 되어있죠. HelloCpp에 하다보니 추가하게 되네요.

 자 이것으로 cocos2d-x에 rapidjson 통합은 끝입니다. 이제 간단한 소스 샘플을 정리해봅니다. 자세한 문서는 rapidjson UserGuid를 참고하거나 압축 해제후 들어있는 샘플 소스를 확인하세요.

///< HelloWorldScene.cpp 위에 rapidjson\document.h를 인클루드
#include "rapidjson\document.h"

...
...

bool HelloWorld::init()
{
...
...


    // add the sprite as a child to this layer
    this->addChild(pSprite, 0);

    ///< hello world json 테스트
    const char json[] = "{ \"hello\" : \"world\" }";

    rapidjson::Document d;
    d.Parse<0>(json);

    CCLOG("%s\n", d["hello"].GetString());
 
    return true;
}


 간단한 rapidjson 구글코드 UserGuid에 있는 Hello World json 샘플 코드입니다. printf를 CCLOG로만 바꿨습니다. 실행해보면,

  잘되는군요.

 iOS 역시나 external을 추가해주면 이상없이 잘 됩니다.

 안드로이드의 경우는 Android.mk의 LOCAL_C_INCLUDES에 추가해줍니다.

 다행이 rapidjson이 cocos2d-x win32, ios, android 모두 궁합이 잘 맞네요. 이제 json 본격적으로 가지고 놀아봐야겠습니다. 이렇게 클라이언트 개발자가 node.js로 서버개발의 영역으로 한단계 더 진입하게 되네요 ㅎ;

 마지막으로 웹에서 JSON이 제대로 되었는지 체크해주는 JSONLint 사이트가 있네요.

댓글

이 블로그의 인기 게시물

라즈베리파이 라즈비안 한글 입력하기 - IBus

라즈베리파이 라즈비안 한글 깨짐 수정하기

'xxx.exe' 프로그램을 시작할 수 없습니다. 지정된 파일을 찾을 수 없습니다.