C ++ REST SDK,解析包含(0xEF 0xBF 0xBF)字符的JSON

时间:2015-11-17 20:09:12

标签: c++ json parsing casablanca

我有一个REST API,它返回一个包含文件元数据的字符串。在那些文件中我有一个有"" (0xEF0xBF0xBF,link)字符名称。当我尝试解析这样的响应时,我会得到例外情况:

e = {_message="* Line 1, Column 13 Syntax error: Malformed string literal" } 

这是我试图解析的字符串:

  

{" files":[[" Thunderbolt Gigabit Ethernet Adapter.txt",[" bc288518-c426-4dbd-9600-a213a35d1c04",1447772221866,9 "的Bartosz"" Siewior"]],[" System.Windows.Interactivity.dll" [" 56ce759b-019B-4723-8fca- 7af877908971",1440507238241,55904,"的Bartosz"" Siewior"]]]," folderPermission":[[" MODIFY"] ]"目录":[]}

我用来接收和解析字符串的代码:

// ...
client.request(request).then([&](web::http::http_response response) {
        status_code = response.status_code();
        //response.extract_json(true).then([&](pplx::task<web::json::value> previousTask) {
        response.extract_string().then([&](pplx::task<utility::string_t> previousTask) {
            try {

                utility::string_t str_response = previousTask.get();
                web::json::value root;
                root = web::json::value::parse(str_response);
            }
            catch (const web::http::http_exception& e) {
                std::wstringstream ss;
                ss << e.what();
                str_response = ss.str();
            }
            catch (const web::json::json_exception& e) {
                std::wstringstream ss;
                ss << e.what();
                str_response = ss.str();
            }

            TaskExecutionData data = { task.id, status_code, str_response.c_str() };
            callback(data);
        }).wait();
    }).wait();

VS2013 JSON Visualizer可以正确解析并显示结果:VS_json_visualizer

我已经尝试过C ++ REST版本2.5.0和2.6.0,它们都无法解析该字符串......你有任何想法吗?

1 个答案:

答案 0 :(得分:0)

来自卡萨布兰卡队的回答:

问题是在Windows上我们使用UTF16解析你遇到问题的特定字符到0xFFFF。这也是std :: char_traits :: eof()返回的字符,因此我们将代码点检测为&#34;流的结尾&#34;发信号并适当地终止解析。

UTF8解析器不应该有这些问题,所以作为一种解决方法,您可以执行类似于当前web :: json :: value :: parse()函数在json_parsing.cpp:1245中的工作方式,除了使用char作为模板参数而不是utility :: char_t。