curlcode

Mattepuffo's logo
Parsing JSON in C++ con Rapidjson

Parsing JSON in C++ con Rapidjson

Per fare il parsing di una struttra JSON in C++ ci stanno molte librerie; io mi sono buttato su Rapidjson.

La documentazione sul sito ufficiale non è proprio il massimo, ma nel complesso è abbastanza semplice da implementare e includere nel nostro progetto.

Scaricate la libreria e aggiungete la cartella rapidjson al progetto; dentro ci stanno diversi file .h.

Quello che faremo è usare CURL per prendere i dati da remoto, fare il cast di CURLcode in string, e infine parsare i dati JSON.

Cominciamo come al solito dal file di intestazione:

#ifndef READ_H
#define    READ_H

#include <iostream>
#include <curl/curl.h>
#include <iomanip>
#include "rapidjson/document.h"
#include "rapidjson/rapidjson.h"

using namespace std;
using namespace rapidjson;

extern "C" int readCurlHelper(char *data, size_t size, size_t nmemb, string *buffer);

class Read {
public:
    Read();
    virtual ~Read();
    void read(string file);
    size_t curlToString(char *data, size_t size, size_t nmemb, string *buffer);
private:
    string response;
    string url;
    CURL *curl;
    CURLcode res;
    struct curl_slist *headers;
    Document document;
};

#endif

Rispetto all'ultimo articolo, abbiamo aggiunto le librerie rapidjson e un oggetto Document.

Mattepuffo's logo
Da CURLcode a string in C++

Da CURLcode a string in C++

In questo articolo abbiamo introdotto l'uso di CURL in C++ facendo un esempio di base.

In genere però é più probabile dover trasformare la risposta che ci arriva come oggetto CURLcode, ad esempio in string perchè poi processata.

Ad esempio se ci arriva in JSON (come nel mio caso).

Quindi dobbiamo convertire CURLcode in string.

Per farlo dobbiamo apportare un pò di modifiche; cominciamo dal file .h:

#ifndef READ_H
#define    READ_H

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

using namespace std;

extern "C" int readCurlHelper(char *data, size_t size, size_t nmemb, string *buffer);

class Read {
public:
    Read();
    virtual ~Read();
    void read(string file);
    size_t curlToString(char *data, size_t size, size_t nmemb, string *buffer);
private:
    string response;
    string url;
    CURL *curl;
    CURLcode res;
    struct curl_slist *headers;
};

#endif

Abbiamo aggiunto due funzioni, una interna che si occupa di costruire la stringa, e una esterna che si occupa della conversione.