在cocos2dx for lua中,我們經常通過lua的table傳入c++使用,然后早c++層操作數據。
實現步驟大致如下:
table->string->c++層->通過rapidjson解析->存放在map中管理
在lua中,轉換table大致如下
local tbl = {}
tbl["fang"] = 1
tbl["jian"] = 1.4
tbl["heng"] = true
tbl["fjh"] = 12345677
tbl["what"] = "fuck"
local str = json.encode(tbl)
--打印str:
{"fang":1,"jian":1.4,"heng":true,"fjh":12345677,"what":"fuck"}
將str傳入c++層,通過rapidjson::Document進行解析str,然而,json字符串中的數據類型不確定,
但觸控已經封裝好了一個CCLValue類給我們使用,它能存放任何值簡單的數據類型進行保存,然后需要的
時候再進行獲取。這里提供CCLValue.h和CCLValue兩個文件下載:
http://pan.baidu.com/s/1c06Z0xM
以下方法是通過字符串轉換成map保存的方法:
map<string,LValue> TestLValue::jsonStringToMap(const string& jsonString)
{
rapidjson::Document doc;
doc.SetObject();
doc.Parse<rapidjson::kParseDefaultFlags>(jsonString.c_str());
map<string,LValue> m;
for(rapidjson::Value::MemberIterator iter = doc.MemberonBegin();iter != doc.MemberonEnd();iter++)
{
const char * key = iter->name.GetString();
const rapidjson::Value& val = iter->value;
if(val.IsDouble())
m.insert(make_pair(key, LValue(val.GetDouble())));
else if(val.IsBool())
m.insert(make_pair(key, LValue(val.GetBool())));
else if(val.IsInt())
m.insert(make_pair(key, LValue(val.GetInt())));
else if(val.IsInt64())
m.insert(make_pair(key, LValue(val.GetInt64())));
else if(val.IsString())
m.insert(make_pair(key, LValue(val.GetString())));
}
return m;
}
過程很簡單,返回值的map<string,LValue>中的LValue的值需要判斷其數據類型然后進行獲取
if (it->second.getType()==LValue::Type::DOUBLE) {
double value = it->second.asDouble();
}
else if (it->second.getType()==LValue::Type::INTEGER) {
int value = it->second.asInt();
}
.
.
.
還有float、string、int64、bool、int64就不一一細寫了
轉載請注明出處,from 博客園 HemJohn