【cocos2dx】rapidjson使用方法以及中文顯示的解決方法【續(xù)】
來源:程序員人生 發(fā)布時間:2014-09-29 19:37:29 閱讀次數(shù):3508次
上一個博客講了怎么用rapidjson讀取中文字符串,但是有一個很明顯的缺陷 就是不能直接讀取數(shù)據(jù)編輯器導出的數(shù)據(jù)。下面我們來修復這個bug并且將代碼精簡到不到原來的一半大小。
上一博客的地址是:【cocos2dx】rapidjson使用方法以及中文顯示的解決方法
不多說 直接上源碼吧:
首先,數(shù)據(jù)編輯器導出的格式是:
[{"id":1,"content":"再次按下返回鍵退出游戲"},{"id":2,"content":"五子棋"},{"id":3,"content":"黑色方"},{"id":4,"content":"白色方"},{"id":5,"content":"當前玩家"},{"id":6,"content":"小提示:"},{"id":7,"content":"null"},{"id":8,"content":"null"},{"id":9,"content":"null"},{"id":10,"content":"null"},{"id":11,"content":"null"},{"id":12,"content":"null"},{"id":13,"content":"null"},{"id":14,"content":"null"},{"id":15,"content":"null"},{"id":16,"content":"null"},{"id":17,"content":"null"}]
導出的時候請選擇以屬性的方式導出
解析的類:
#pragma once
/*
* 獲取字符串類 單例
* 用于獲取JSON文件中的中文字符串
*/
#include "cocos2d.h"
#include <string>
#include <cocos-ext.h>
#include "cocostudioCocoStudio.h"
#include "uiCocosGUI.h"
USING_NS_CC;
USING_NS_CC_EXT;
using namespace std;
using namespace cocostudio;
/**
* 數(shù)據(jù)ID的宏定義,用于找到中文數(shù)據(jù)
*/
static int s_iExit = 1; //再次按下返回鍵退出游戲
class ReadString
{
protected:
rapidjson::Document m_doc; //暫存的數(shù)據(jù)
static ReadString* rs;
public:
static ReadString* getInstance();
std::string parse(int key);
private:
static ReadString* creat(std::string fileName);
bool init(std::string fileName);
ReadString(){};
~ReadString(void){};
};
然后是cpp:
#include "ReadString.h"
ReadString* ReadString::rs = nullptr; //初始化
ReadString* ReadString::creat(std::string fileName)
{
ReadString *RS = new ReadString();
if(!RS || !RS->init(fileName))
{
delete RS;
RS = nullptr;
return nullptr;
}
return RS;
}
bool ReadString::init(std::string fileName)
{
bool ret = false;
do {
std::string jsonpath = FileUtils::getInstance()->fullPathForFilename(fileName);
std::string contentStr = FileUtils::getInstance()->getStringFromFile(jsonpath);
m_doc.Parse<0>(contentStr.c_str());
CC_BREAK_IF(m_doc.HasParseError());
ret = true;
} while (0);
return ret;
}
ReadString* ReadString::getInstance()
{
if(rs == nullptr)
rs= ReadString::creat("String.json");
return rs;
}
string ReadString::parse(int key)
{
if (!m_doc.IsNull() && m_doc.IsArray()) //判斷是不是數(shù)組
{
for(unsigned int i=0;i<m_doc.Size();++i)
{
do {
CC_BREAK_IF(m_doc[i].IsNull());
CC_BREAK_IF(m_doc[i]["id"].IsNull());
int i_id = m_doc[i]["id"].GetInt();
CC_BREAK_IF(i_id != key); //這一行是尋找相同的key,找到了才執(zhí)行下面的語句,找不到就開始下一個循環(huán)
CC_BREAK_IF(m_doc[i]["content"].IsNull());
return m_doc[i]["content"].GetString();
}while(0);
}
}
return ""; //沒查找到任何對象則返回空字符串
}
上一個博客中的read函數(shù)被我改成了parse,其實功能是一樣的。但是是不是覺得這樣好看很多哈。(好吧,其實還是那么難看)
使用的方法也是一樣的:
ReadString::getInstance()->parse(s_iExit)
生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學習有所幫助,可以手機掃描二維碼進行捐贈