libcurl 坑之 CURLOPT_WRITEFUNCTION
参考blog:
https://blog.csdn.net/szchtx/article/details/21740599
如果服务器返回的数据比较长,那么坑会多次调用这个callback,那么我们可以在序列化的时候判断是不是完整的数据,如果序列化失败那么说明是部分数据,需要拼接如下:
size_t QWidgetDemo::onLoginCallBack(char* dest, size_t size, size_t nmemb, void* userp)
{
json_error_t error;
static std::string realJsonData = std::string();//拼接真正的数据如果需要拼接的话
size_t real_size = nmemb * size;
char* szStr = (char*)malloc(( real_size + 1) * sizeof(char));
if (!szStr)
return real_size;
memcpy(szStr, dest, real_size);
std::string tempStr = std::string();
szStr[real_size] = '\0';
tempStr = realJsonData + szStr;
tempStr = UTF8_To_string(tempStr);
json_t* root = json_loads(szStr, 0, &error);
if (!root) {
std::cout << "load json fail: " << error.text << std::endl;
realJsonData = realJsonData + szStr;
free(szStr);
return size * nmemb;
}
else
{
realJsonData = std::string();
}
free(szStr);
//
// dosomething
//
}
CURLOPT_WRITEFUNCTION 回调回来的数据始终是不规则的json。
服务器返回的是utf-8,使用win32接口utf-8 To ansi (MS官网手册就有)
使用c++11(下面附上)
#include <locale>
#include <codecvt>
int strTowstr(std::wstring& ws, const std::string& s)
{
std::wstring wsTmp(s.begin(), s.end());
ws = wsTmp;
return 0;
}
std::string utf8_encode(const std::wstring& source)
{
return std::wstring_convert<std::codecvt_utf8<wchar_t>>().to_bytes(source);
}
std::wstring utf8_decode(const std::string& source)
{
return std::wstring_convert<std::codecvt_utf8<wchar_t>>().from_bytes(source);
}
两者转换接口一样,此时看了上面老哥的的说法,我验证了一下可能我取的方法有问题,直接拷贝一份,并且附上结束符就解决了
错误的数据: json 0尾部多了个0导致不能正常序列化反序列化
通过拷贝出来自己附上结束符: json并且能正常的序列化,反序列化