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對象,然後再進行轉化就可以了。
本地存儲的過程就很簡單了,不細說了。這裏主要說一下類型轉化,不要用自己封裝的接口,一個是代碼風格不統一,而且贅肉會越來越多。
最後看一下效果吧,這是保存成功,前端解析到的路徑
然後打開看一下保存的內容