Last active
August 11, 2022 04:35
-
-
Save connormanning/41efa6075515019e499c to your computer and use it in GitHub Desktop.
Curl HTTP GET and JsonCpp parsing - basic functionality
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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. | |
long 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.get(), 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; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env bash | |
g++ curl_jsoncpp_example.cpp -ljsoncpp -lcurl -o example.out && ./example.out |
error C4996: 'Json::Reader': Use CharReader and CharReaderBuilder instead what I can do to fix it ?
This is because the person that posted this has not updated the code for the latest version.
class JSONCPP_DEPRECATED(
"Use CharReader and CharReaderBuilder instead.") JSON_API Reader {
So basically replace:
Json::Reader jsonReader;
With:
Json::CharReaderBuilder builder;
Also replace:
std::unique_ptr<std::string> httpData(new std::string()); // why would you even do this!?
With:
std::string httpData;
Complete "fix":
// Response looks good - done using Curl now. Try to parse the results
// and print them out.
Json::Value jsonData;
JSONCPP_STRING jsonError;
Json::CharReaderBuilder builder;
const std::unique_ptr<Json::CharReader> reader(builder.newCharReader());
if (reader->parse(httpData.c_str(), httpData.c_str() + httpData.length(), &jsonData, &jsonError))
after using the "fix" httpData.get is not available anymore
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
error C4996: 'Json::Reader': Use CharReader and CharReaderBuilder instead what I can do to fix it ?