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对象,然后再进行转化就可以了。
本地存储的过程就很简单了,不细说了。这里主要说一下类型转化,不要用自己封装的接口,一个是代码风格不统一,而且赘肉会越来越多。
最后看一下效果吧,这是保存成功,前端解析到的路径
然后打开看一下保存的内容