Использование библиотеки RapidJSON

Автор: | 6 февраля, 2022

Данная библиотека позволяет парсить и создавать Json файлы.

Преимущество использования данной библиотеки:

RapidJSON небольшой. Он поддерживает API в стиле SAX и DOM. Парсер SAX состоит всего из полутысячи строк кода.

RapidJSON работает быстро. Его производительность может быть сравнима с strlen().Он также дополнительно поддерживает SSE2/SSE4.2 для ускорения.

RapidJSON является автономным. Он не зависит от внешних библиотек, таких как BOOST. Даже не зависит от STL.

RapidJSON оптимизирован по использованию памяти. Каждое значение JSON занимает ровно 16 байт для большинства 32/64-разрядных машин (исключая текстовую строку). По умолчанию он использует быстрый распределитель памяти, и синтаксический анализатор компактно выделяет память во время синтаксического анализа.

RapidJSON совместим с Unicode. Он поддерживает UTF-8, UTF-16, UTF-32 (LE и BE), а также их внутреннее обнаружение, проверку и транскодирование. Например, вы можете прочитать файл UTF-8 и позволить RapidJSON транскодировать строки JSON в UTF-16 в DOM. Он также поддерживает суррогаты и «\ u0000» (нулевой символ).

Библиотека поставляется в виде исходников и ее достаточно только подключить к проекту.

Скачать можно по ссылке.

Рассмотрим пример парсинга json файла:

{
  "array": [
    1,
    2,
    3,
    4
  ],
  "boolean": true,
  "color": "#29AEC9",
  "null": null,
  "number": 1234,
  "object": {
    "a": "b",
    "c": "d"
  },
  "string": "Test",
  "Test1": {
    "T": [
      "1",
      "2",
      "3"
    ],
    "int": 123
  }
}

Пример небольшой но достаточно информативный.

Полный листинг программы:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QFile>
#include <QDebug>
#include "rapidjson/document.h"
#include "rapidjson/error/en.h"


namespace Ui {
class MainWindow;
}

using namespace rapidjson;

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    void readJson();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    readJson();
}

MainWindow::~MainWindow()
{
    delete ui;
}


void MainWindow::readJson()
{
    QString json;
    QFile file("1.json");
    if(file.open(QIODevice::ReadOnly)) {
        json = file.readAll();
        file.close();
    }

    qDebug() << json;

    Document document;


    if (!document.Parse(json.toStdString().c_str()).HasParseError())
    {
        if (document.IsObject())
        {

            if (document.HasMember("array")) // Получаем данные из массива array
            {
                if (document["array"].IsArray())
                {
                    Value::Array ds =  document["array"].GetArray();

                    for (Value::ConstValueIterator itr = ds.Begin(); itr != ds.End(); ++itr) {
                        const Value& attribute = *itr;
                        qDebug() << attribute.GetInt();
                    }
                }
            }

            if (document.HasMember("boolean")) // Получаем данные из boolean
            {
                if (document["boolean"].IsBool())
                {
                    qDebug() <<  document["boolean"].GetBool();
                }
            }


            if (document.HasMember("color")) // Получаем данные из color
            {
                if (document["color"].IsString())
                {
                    qDebug() <<  document["color"].GetString();
                }
            }

            if (document.HasMember("null")) // Получаем данные из null
            {
                if (document["null"].IsNull())
                {
                    qDebug() <<  document["null"].GetType();
                }
            }

            if (document.HasMember("number")) // Получаем данные из number
            {
                if (document["number"].IsInt())
                {
                    qDebug() <<  document["number"].GetInt();
                }
            }

            if (document.HasMember("object")) // Получаем данные из object
            {
                const   Value & a = document["object"];

                if (a.HasMember("a")) // Получаем данные из object a
                {
                    qDebug() << a["a"].GetString();
                }

                if (a.HasMember("c")) // Получаем данные из object c
                {
                    qDebug() << a["c"].GetString();
                }

            }


            if (document.HasMember("string")) // Получаем данные из string
            {
                if (document["string"].IsString())
                {
                    qDebug() <<  document["string"].GetString();
                }
            }

            if (document.HasMember("Test1")) // Получаем данные из Test1
            {
                Value & a = document["Test1"];  // Получаем данные из массива T

                if (a.HasMember("T"))
                {

                    if (a["T"].IsArray())
                    {
                        Value::Array ds =  a["T"].GetArray();

                        for (Value::ConstValueIterator itr = ds.Begin(); itr != ds.End(); ++itr) {
                            const Value& attribute = *itr;
                            qDebug() << attribute.GetString();
                        }
                    }
                }

                if (a.HasMember("int"))  // Получаем данные из int
                {
                    if (a["int"].IsInt())
                    {
                        qDebug() <<  a["int"].GetInt();
                    }
                }

            }

        }

    }

    else {
        qDebug() <<  document.GetErrorOffset();
        qDebug() <<  GetParseError_En(document.GetParseError());
    }



}

Будет выведено следующее:

1 (array)
2
3
4
true (boolean)
#29AEC9 (color)
0 (null)
1234 (number)
b (object a)
d (object c)
Test (string)
1 (Test1 T)
2
3
123 (int)