C++REST SDK,解析包含(0xEF 0xBF 0xBF)字符的JSON
C++REST SDK, parse JSON that contains (0xEF 0xBF 0xBF) character
我有一个 REST API returns 一个包含文件元数据的字符串。在这些文件中,我有一个名称中有“”(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"]],"directories":[]}
我用来接收和解析字符串的代码:
// ...
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,它们都无法解析该字符串...您有任何想法吗?
卡萨布兰卡团队的回答:
问题是,在 windows 上,我们使用 UTF16 进行解析,您遇到的特定字符映射到 0xFFFF 时遇到问题。这也是 std::char_traits::eof() 返回的字符,因此我们将代码点检测为 "end of stream" 信号并适当地终止解析。
UTF8 解析器不应该有这些问题,因此作为一种解决方法,您可以做一些类似于当前 web::json::value::parse() 函数在 json_parsing.cpp:1245 中的工作方式的操作,除了使用 char 作为模板参数而不是 utility::char_t。
我有一个 REST API returns 一个包含文件元数据的字符串。在这些文件中,我有一个名称中有“”(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"]],"directories":[]}
我用来接收和解析字符串的代码:
// ...
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,它们都无法解析该字符串...您有任何想法吗?
卡萨布兰卡团队的回答:
问题是,在 windows 上,我们使用 UTF16 进行解析,您遇到的特定字符映射到 0xFFFF 时遇到问题。这也是 std::char_traits::eof() 返回的字符,因此我们将代码点检测为 "end of stream" 信号并适当地终止解析。
UTF8 解析器不应该有这些问题,因此作为一种解决方法,您可以做一些类似于当前 web::json::value::parse() 函数在 json_parsing.cpp:1245 中的工作方式的操作,除了使用 char 作为模板参数而不是 utility::char_t。