cocos2d-x JSON 파일을 다루기 (JSONCpp 사용)

|

Json 이란?

JSON(제이슨, JavaScript Object Notation)은, 인터넷에서 자료를 주고받을 때 그 자료를 표현하는 방법이다. 자료의 종류에 큰 제한은 없으며, 특히 컴퓨터 프로그램변수값을 표현하는 데 적합하다.

그 형식은 자바스크립트의 구문 형식을 따르지만, 프로그래밍 언어플랫폼에 독립적이므로 C, C++, C#, 자바, 자바스크립트, , 파이썬 등 많은 언어에서 이용할 수 있다.


Json 홈페이지


json 모듈에는

jsoncpp, jsonBox, rapidjson 등이 있습니다.

안정성은 jsoncpp 속도는 rapidjson 을 선호하는 것 같습니다.

그중에 안전성이 있는 jsoncpp에 대해 알아보겠습니다.

jsoncpp홈페이지에서 파일을 다운받습니다.

http://jsoncpp.sourceforge.net/

jsoncpp-src-0.5.0.tar.gz


첨부파일의 include\json안에 있는 h 파일과

src\lib_json 안에 있는 모든 파일들을 cocos2d-x Class안에 집어넣습니다.












테스트로 읽을 json 파일입니다.

자신의 프로젝트 Resources에 json폴더를 만들고 그 안에 넣어줍니다.

test_data.json

소스입니다.

-> ReadJson버튼 클릭시 readJSON 호출

-> WriteJson버튼 클릭시 writeJSON 호출합니다.

읽을때

void HelloWorld::readJSON( CCObject *pSender )
{
       
    //json 파일 읽기
    //readUserInven("json/test_data.json");
    std::string fileName = CCFileUtils::sharedFileUtils()->fullPathForFilename("json/test_data.json");
       
    unsigned long bufferSize = 0;
    unsigned char* json = CCFileUtils::sharedFileUtils()->getFileData(fileName.c_str(), "rb", &bufferSize );
    std::string clearData((const char*)json,bufferSize); //파일 사이즈만큼 읽어옵니다.
       
    /*
    //파일 끝에 널을 붙여줌
    unsigned long tmpSize = 0;
    unsigned char *fileContent = cocos2d::CCFileUtils::sharedFileUtils()->getFileData( "test.txt", "r", &tmpSize );
    cocos2d::CCString *ccStr = cocos2d::CCString::createWithData( fileContent, tmpSize );
    cocos2d::CCLog( "str: %s", ccStr->getCString() );
    */
   
    //읽기
    readUserInven(clearData);
}




//json 파일 읽기
void HelloWorld::readUserInven( std::string pData )
{
    /*
    읽을 형식
    { "hello" : "world", "t" : true , "f" : false, "n": null, "i":123, "pi": 3.1416, "a":[1, 2, 3, 4] }
    */
    Json::Value root;
    Json::Reader reader;
    bool parsingSuccessful = reader.parse(pData, root);
    if (! parsingSuccessful)
    {
        CCLog("parser failed : \n %s", pData.c_str());
        return ;
    }

    CCLog("JSON ReadTest");

    std::string value1 = root.get("hello", "defaultvalue").asString();
    CCLog("value1 %s", value1.c_str());

    bool value2 = root.get("t", "default").asBool();
    CCLog("value2 %s", value2?"true":"false");

    bool value3 = root.get("f", "default").asBool();
    CCLog("value3 %s", value3?"true":"false");

    bool value4 = root.get("n", "default").isNull();
    CCLog("value4 %s", value4?"null":"?");

    int value5 = root.get("i", "default").asInt();
    CCLog("value5 %d", value5);

    double value6 = root.get("pi", "default").asDouble();
    CCLog("value6 %g", value6);

    {
        //array
        const Json::Value array = root["a"];
        for (unsigned int i = 0; i < array.size(); ++i)
        {
            int item = array[i].asInt();
            CCLog("%d, ", item);
        }
    }
}




파일을 쓸때


void HelloWorld::writeJSON( CCObject *pSender )
{
    //쓰기
    saveUserInven();
}



//JSON 데이터 생성
void HelloWorld::saveUserInven()
{
    // 위와 같은 json 문서 만들기
    Json::Value root;
    root["Name"] = "Hong Gildong";
    root["Age"] = 26;

    Json::Value friends;//배열
    friends.append("Im Kkeokjung");
    friends.append("Elisabeth");
    root["Friend"] = friends;
    root["Sex"] = "male";

    Json::StyledWriter writer;
    std::string strJSON = writer.write(root);

    CCLog("JSON WriteTest : %s" , strJSON.c_str());

    writeFileData( "testJSON.json", strJSON.c_str() );

}
//파일 쓰기
void HelloWorld::writeFileData( std::string pszFileName, const char* pData )
{    
    /*
    {
    "Age" : 26,
    "Friend" : [ "Im Kkeokjung", "Elisabeth" ],
    "Name" : "Hong Gildong",
    "Sex" : "male"
    }
    */

    FILE *fp = fopen(pszFileName.c_str(), "wb");

    if (! fp)
    {
        CCLog("can not create file %s", pszFileName.c_str());
        return;
    }
    else
    {
        CCLog("write file success: %s",pszFileName.c_str());
    }

    fputs(pData, fp); //pdata->fp에 복사

    fclose(fp);

}








jsonTest.zip




'잡다한것들전부 > 심화' 카테고리의 다른 글

cocos2d-x JSON 파일을 다루기 (JSONCpp 사용)  (1) 2013.12.04
Trackback 0 And Comment 1
  1. 브로콜리 2015.01.07 00:51 address edit & del reply

    감사합니다ㅠㅠ