CEF json操作以及字符轉化

CEF開發過程中,經常涉及字符轉化的場景。其實CEF本身提供了很方便的字符轉化操作,所以基本不需要使用一些API封裝的字符轉化函數。

CEF封裝的js 接口,傳入的字符類型,默認都是utf8格式的編碼。這裏轉化的時候需要注意一下,如果包含中文,轉化過程中可能有亂碼。

CefString 與std::string 和 std::wstring 之間的轉化

CEF中的json操作

 比如現在封裝一個支持前端調用,本地存儲json文件的操作,並且返回文件路徑到前端。

前端傳入json格式的字符串,json按字典格式存儲(存儲格式決定了CEF中解析時候使用的數據結構),其中data結點包含一個數組t,前端調用如下

    var parms = {
        "func": "save_scene",
        "data": t
    }
    application.reflect(JSON.stringify(parms), function(res) {
        //console.log("camera back message:" + res);
        var obj = JSON.parse(res); //由JSON字符串轉換爲JSON對象
        var path = obj.result.path;

        alert(path);

        cacheLatestSence(path);
    });

CEF中先經過V8路由到customclient 端。需要解析出本地存儲信息t,然後進行文件寫入。

首先將json格式的字符串解析成CEF中的value對象

CefRefPtr<CefValue> jsonObject = CefParseJSON(strFunc, JSON_PARSER_ALLOW_TRAILING_COMMAS);

前文中已經提到過,json格式按字典格式存儲,所以這個value對象實際應該是一個dictionary對象。

CefRefPtr<CefDictionaryValue> dict = jsonObject->GetDictionary(); 

然後就可以從dict 中解析出json結構中定義的【func】【data】。

其中func 按一般的字符串進行解析就可以。data是一個數組結構,應該對應的是CEF中的CefListValue對象。如果不確定,需要先判斷data的類型

CefValueType type = dict->GetType("data");
                if (type == VTYPE_LIST)
                {
                    CefRefPtr<CefListValue> list = dict->GetList("data");
                    CefRefPtr<CefValue> pValue = CefValue::Create();
                    pValue->SetList(list);
                    strJson = CefWriteJSON(pValue, JSON_WRITER_DEFAULT);
                }

其中類型有多種定義

typedef enum {
  VTYPE_INVALID = 0,
  VTYPE_NULL,
  VTYPE_BOOL,
  VTYPE_INT,
  VTYPE_DOUBLE,
  VTYPE_STRING,
  VTYPE_BINARY,
  VTYPE_DICTIONARY,
  VTYPE_LIST,
} cef_value_type_t; 

 然後需要將CefListValue對象轉化成json字符串,存儲到本地文件中。但是實際操作的時候,發現CefListValue轉json的時候,只接受CefValue類型的數據。這裏用CefValue包一下CefListValue對象,然後再進行轉化就可以了。

本地存儲的過程就很簡單了,不細說了。這裏主要說一下類型轉化,不要用自己封裝的接口,一個是代碼風格不統一,而且贅肉會越來越多。

最後看一下效果吧,這是保存成功,前端解析到的路徑

然後打開看一下保存的內容

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章