Bartłomiej Stefański
Biblioteka typu Header-Only do pracy z plikami JSON zawierająca parser oraz klasy budujące abstrakcje nad typami JSON.
Możliwe są dwa sposoby instalacji:
Należy pobrać repozytorium projektu, a następnie zawartość folderu include
przenieść do systemowego katalogu na pliki nagłówkowe (dla systemów linux /usr/include
).
Wystarczy pobrać repozytorium projektu do dowolnego foldera.
Należy wtedy pamiętać o dodaniu ścieżki repozytorium do miejsc, w których kompilator będzie szukać plików nagłówkowych np. poprzez dodanie parametru: -I/{ścieżka-do-repozytorium}/include/
.
- Kompilator C++ wspierający standard
C++23
; testowane dlag++ 11.4.0
Znajduje się w folderze docs
.
Czytanie najlepiej zacząć od Spisu Klas.
W folderze examples
znajdują się trzy proste przykłady:
bjq
– formatter/linter plików JSON'reader
– programu czytający plik JSONwriter
– program tworzący i wypisujący strukturę JSON
W folderze znajduje się również plik Makefile
, który skompiluje wszystkie trzy programy oraz przykładowe wejścia dla tych programów.
Wystarczy dołączyć jeden plik:
#include <BetterJson/json.hpp>
Nie należy dołączać innych plików.
Wykonywane z użyciem klasy Parser. Możliwe jest parsowanie plików, strumieni i buforów:
auto jsonCin{json::Parser<>::parse(std::cin)}; // parsuj strumień wejściowy
auto jsonBuffer{json::Parser<>::parse(buffor)}; // parsuj bufor
auto file{json::FileStream("test.json")};
auto jsonFile{json::Parser<>::parse(file)}; // parsuj plik "test.json"
Klasa Json
Jest to interfejs implementowany przez klasy reprezentujące typy wartości JSON.
Jako że jest to klasa abstrakcyjna zawsze będzie w formie:
Json&
– referencji bez własności nad obiektemstd::shared_ptr< Json >
– wskaźnika z własnością nad obiektem
Implementują interfejs podobny do prymitywnych / STL'owych odpowiedników:
json::Int i = 23;
i += 121;
json::String str("some text");
str.append(" more text");
json::Array arr{};
arr.push_back(i);
foo(arr[0]);
json::Object obj;
obj.emplace(str, i);
std::cout << obj[str];
Jeśli dysponujemy referencją lub wskaźnikiem na Json
, to by skorzystać z interfejsu udostępnionego przez podklasę należy wykonać konwersję. Pozwala na to funkcja as< T >
zaimplementowana dla typu Json
:
obj[key].as< json::Int >() = 42;
Jeśli referencja na Json
tak naprawdę nie jest typu T
to rzucony zostanie wyjątek json::BadCast
.
Jest to wyjątkowo destruktywna operacja stąd dostępna jest tylko dla właścicieli obiektów (std::shared_ptr
). W momencie wykonania należy uznać wszystkie nie-posiadające referencje za niepoprawne.
Konwersji można dokonać używając statycznej funkcji json::Json::castTo< T >
:
json::Json::castTo< json::Bool >(arr[0]);
Jeśli spróbujemy castować na ten typ, którym obiekt już jest, to funkcja nie będzie mieć efektu.
Klasa Json
posiada nadpisany operator <<
, stąd do wypisania struktury można skorzystać ze standardowego interfejsu strumieni C++:
std::cout << json;
Format wypisywania można dostosować używając funktora Printer.
Co można zrobić dalej:
- Poprawić strategię MemoryPool – teraz jest bardzo prosta
- Pozwolić na wykonywanie większej ilości operacji na stałych referencjach do podklas
Json
– obecnie prawie nic nie można z nimi zrobić - Umożliwić wykonywanie operacji read-only bez konwertowania typów prymitywnych do abstrakcyjnych