Bwar / CJsonObject

Ultralightweight JSON parser in C++ based on cJSON
MIT License
648 stars 239 forks source link

請問有時候 neb::CJsonObject oJson(str_json); 會失敗 #16

Closed curtisyang2008 closed 4 years ago

curtisyang2008 commented 4 years ago

我想把收下來的JSON string data放進去 CJsonObject neb::CJsonObject oJson(str_json);

當資料是6筆的時候會成功,如下檔案: CJsonObject success.txt

當資料是7筆的時候會失敗,cout <<oJson.ToString()為空值 CJsonObject fail.txt

懇請解惑,謝謝

Bwar commented 4 years ago

文件内容有问题,dos2unix处理一下文件后可以正常解析。 应该是'\r'字符问题

curtisyang2008 commented 4 years ago

感謝您的回覆,抱歉上次資料沒有提供得很正確

我是直接從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();

謝謝您的回覆

Bwar commented 4 years ago

我的机器没有安装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 测试结果是完全正常的。

curtisyang2008 commented 4 years ago

改用curl.exe 直接下command後,測試結果正常了,看來問題可能出在 libcurl,感謝您的幫助