gpt4 book ai didi

c++ - 使用 libCurl 和 JsonCpp 从 https 网络服务器解析

转载 作者:太空狗 更新时间:2023-10-29 19:43:34 25 4
gpt4 key购买 nike

因此,我一直在互联网上寻找使用 libcurl 和 jsoncpp 解析 JSON 的基本示例,但一直找不到。

有人可以指出正确的方向或在这里指定,一个使用 libcurl 和 jsoncpp 的简单示例,从指定网页下载 json(链接本身以 .json 结尾,因此它将直接拉取 json)解析它并打印出来。

感谢所有帮助。谢谢!

尤登

最佳答案

这是一个独立的示例,用于 a) 通过 libcurl HTTP GET JSON 对象,然后 b) 使用 JsonCpp 解析它。 @WhozCraig 说这是两个完全独立的事件是正确的,但我碰巧有一个项目同时执行这两项事件,所以我汇总了这个从 this nifty page 中获取和解析 JSON 的小样本。 .

如果您将这段代码放在名为 main.cpp 的文件中,那么您可以编译、链接和运行(假设 libcurl 和 libjsoncpp 在您的路径上可用):

g++ main.cpp -ljsoncpp -lcurl -o example.out && ./example.out

// main.cpp
#include <cstdint>
#include <iostream>
#include <memory>
#include <string>

#include <curl/curl.h>
#include <json/json.h>

namespace
{
std::size_t callback(
const char* in,
std::size_t size,
std::size_t num,
std::string* out)
{
const std::size_t totalBytes(size * num);
out->append(in, totalBytes);
return totalBytes;
}
}

int main()
{
const std::string url("http://date.jsontest.com/");

CURL* curl = curl_easy_init();

// Set remote URL.
curl_easy_setopt(curl, CURLOPT_URL, url.c_str());

// Don't bother trying IPv6, which would increase DNS resolution time.
curl_easy_setopt(curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);

// Don't wait forever, time out after 10 seconds.
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 10);

// Follow HTTP redirects if necessary.
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);

// Response information.
int httpCode(0);
std::unique_ptr<std::string> httpData(new std::string());

// Hook up data handling function.
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, callback);

// Hook up data container (will be passed as the last parameter to the
// callback handling function). Can be any pointer type, since it will
// internally be passed as a void pointer.
curl_easy_setopt(curl, CURLOPT_WRITEDATA, httpData.get());

// Run our HTTP GET command, capture the HTTP response code, and clean up.
curl_easy_perform(curl);
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &httpCode);
curl_easy_cleanup(curl);

if (httpCode == 200)
{
std::cout << "\nGot successful response from " << url << std::endl;

// Response looks good - done using Curl now. Try to parse the results
// and print them out.
Json::Value jsonData;
Json::Reader jsonReader;

if (jsonReader.parse(*httpData, jsonData))
{
std::cout << "Successfully parsed JSON data" << std::endl;
std::cout << "\nJSON data received:" << std::endl;
std::cout << jsonData.toStyledString() << std::endl;

const std::string dateString(jsonData["date"].asString());
const std::size_t unixTimeMs(
jsonData["milliseconds_since_epoch"].asUInt64());
const std::string timeString(jsonData["time"].asString());

std::cout << "Natively parsed:" << std::endl;
std::cout << "\tDate string: " << dateString << std::endl;
std::cout << "\tUnix timeMs: " << unixTimeMs << std::endl;
std::cout << "\tTime string: " << timeString << std::endl;
std::cout << std::endl;
}
else
{
std::cout << "Could not parse HTTP data as JSON" << std::endl;
std::cout << "HTTP data was:\n" << *httpData.get() << std::endl;
return 1;
}
}
else
{
std::cout << "Couldn't GET from " << url << " - exiting" << std::endl;
return 1;
}

return 0;
}

输出如下:

Got successful response from http://date.jsontest.com/Successfully parsed JSON dataJSON data received:{   "date" : "03-09-2015",   "milliseconds_since_epoch" : 1425938476314,   "time" : "10:01:16 PM"}Natively parsed:    Date string: 03-09-2015    Unix timeMs: 1425938476314    Time string: 10:01:16 PM

关于c++ - 使用 libCurl 和 JsonCpp 从 https 网络服务器解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24884490/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com