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对象,然后再进行转化就可以了。

本地存储的过程就很简单了,不细说了。这里主要说一下类型转化,不要用自己封装的接口,一个是代码风格不统一,而且赘肉会越来越多。

最后看一下效果吧,这是保存成功,前端解析到的路径

然后打开看一下保存的内容

 

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