c++ json字符串轉換成map管理


在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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM