[英]Using libCurl and JsonCpp to parse from https webserver
So I've been looking around the inte.net for a basic example of parsing JSON using libcurl and jsoncpp but I've not been able to find one.因此,我一直在 inte.net 上寻找使用 libcurl 和 jsoncpp 解析 JSON 的基本示例,但一直找不到。
Could someone please point me in the right direction or specify here, a simple example of using libcurl and jsoncpp, downloading json from a specified webpage (the link itself ending in.json so it will be pulling json directly) parsing it and printing it.有人可以给我指出正确的方向或在此处指定,一个使用 libcurl 和 jsoncpp 的简单示例,从指定网页下载 json(链接本身以 .json 结尾,因此它将直接拉取 json)解析并打印。
All help is appreciated.感谢所有帮助。 Thanks!
谢谢!
Euden尤登
Here's a self-contained example to a) HTTP GET a JSON object via libcurl and then b) parse it with JsonCpp. 这是一个自包含的例子:a)HTTP通过libcurl获取JSON对象,然后b)用JsonCpp解析它。 @WhozCraig is correct to say that these are two totally separate activities, but I happen to have a project that does both so I aggregated this small sample that fetches and parses the JSON from this nifty page .
@WhozCraig说这是两个完全独立的活动是正确的,但我碰巧有一个项目同时执行这两个操作,因此我汇总了这个从这个漂亮的页面获取和解析JSON的小样本。
If you put this code in a file called main.cpp
, then you can compile, link, and run (assuming libcurl and libjsoncpp are available on your path) with: 如果将此代码放在名为
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;
}
Output looks like: 输出如下:
Got successful response from http://date.jsontest.com/ Successfully parsed JSON data JSON 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
The code provided above by @ConnorManning still works well in 2022 (I cannot comment there because I do not have enough "points" for that) @ConnorManning 上面提供的代码在 2022 年仍然运行良好(我不能在那里发表评论,因为我没有足够的“积分”)
However, after compilation it might SIGSEGV
on url
, so here is the quick fix.但是,编译后它可能会在
url
上发出SIGSEGV
,所以这里是快速修复。 Change line:换行:
const std::string url("http://date.jsontest.com/");
into进入
const char* url = "http://date.jsontest.com/";
Compile the same way and it should work well.以相同的方式编译,它应该运行良好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.