Closed curtisyang2008 closed 4 years ago
文件内容有问题,dos2unix处理一下文件后可以正常解析。 应该是'\r'字符问题
感謝您的回覆,抱歉上次資料沒有提供得很正確
我是直接從URL 抓資料存成str_json的,所以應該不會存在dos2unix的問題,在資料裡並沒有發現 '\r' 字元
失敗的資料URL如下: https://itc-q1.lixueyun.cn/imdm/api/Fixture/?last=1578029542562_5cd3d7fd594af50e4e9a2f91&count=7
成功的資料URL: https://itc-q1.lixueyun.cn/imdm/api/Fixture/?last=1578029542562_5cd3d7fd594af50e4e9a2f91&count=6
程式碼如下:
CURL *curl;
CURLcode res;
curl_global_init(CURL_GLOBAL_DEFAULT);
curl = curl_easy_init();
stringstream out;
struct curl_slist *headers = NULL;
string URL="https://itc-q1.lixueyun.cn/imdm/api/Fixture/?last=1578029542562_5cd3d7fd594af50e4e9a2f91&count=7";
headers = curl_slist_append(headers, "Accept:application/json");
headers = curl_slist_append(headers, "Content-Type:application/json");
headers = curl_slist_append(headers, "charset:utf-8");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_URL, URL.c_str());
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, false);
curl_easy_setopt(curl, CURLOPT_USE_SSL, CURLUSESSL_ALL);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &out);
res = curl_easy_perform(curl);
/* Check for errors */
if (res != CURLE_OK)
{
fprintf(stderr, "curl_easy_perform() failed: %s\n",
curl_easy_strerror(res));
return 0;
}
//cout << "out =" << out.str() << endl;
string str_json = out.str();
neb::CJsonObject oJson(str_json);
cout << "oJson=" << oJson.ToString() << endl;
curl_easy_cleanup(curl);
curl_global_cleanup();
謝謝您的回覆
我的机器没有安装libcurl库,平时比较忙,测试你的代码可能花点时间,所以没测试。 建议你在做json解析前打印一下字符串,换一种方式测试一下,我用curl命令获取你的数据重定向到文件,再从文件中读取内容来解析是OK的。
curl "https://itc-q1.lixueyun.cn/imdm/api/Fixture/?last=1578029542562_5cd3d7fd594af50e4e9a2f91&count=7" > CJsonObject.fail.txt
然后把CJsonObject里的demo.cpp改成这样:
#include <string>
#include <iostream>
#include <fstream>
#include <sstream>
#include "../CJsonObject.hpp"
int main(int argc, char* argv[])
{
std::ifstream fin(argv[1]);
if (fin.good())
{
neb::CJsonObject oJson;
std::stringstream ssContent;
ssContent << fin.rdbuf();
if (oJson.Parse(ssContent.str()))
{
std::cout << oJson.ToString() << std::endl;
}
else
{
std::cerr << "parse json error" << std::endl;
}
fin.close();
}
return 0;
}
./CJsonObjectTest CJsonObject.fail.txt 测试结果是完全正常的。
改用curl.exe 直接下command後,測試結果正常了,看來問題可能出在 libcurl,感謝您的幫助
我想把收下來的JSON string data放進去 CJsonObject neb::CJsonObject oJson(str_json);
當資料是6筆的時候會成功,如下檔案: CJsonObject success.txt
當資料是7筆的時候會失敗,cout <<oJson.ToString()為空值 CJsonObject fail.txt
懇請解惑,謝謝