Pistache i RapidJSON - czytanie danych z pliku
Zapowiadałem, że pokażę jak wczytać przy pomocy RapidJSON dane z pliku i odesłać je do użytkownika webserwisu stworzonego w Pistache. Oto jak to możesz zrobić.
Strumień z pliku JSON
Po otwarciu pliku, wykorzystując standardowe fopen, możesz w RapidJSON nakazać aby dane z tego pliku były zaczytane przy pomocy obiektu strumienia FileReadStream. Następnie należy przetworzyć te dane używając metody parseStream obiektu Document. W ten nieskomplikowany sposób możesz w kilku linijkach kody w szybki i wydajny sposób uzyskać dostęp do zapisanych w plikach JSON. Możesz sprawdzać ich wartości, manipulować nimi, zapisywać ponownie do pliku (tu pomocny może okazać się obiekt klasy FileWriteStream). Poniższy przykład pokazuje jak otwieram plik z konfiguracją na podstawie której otwieram docelowy plik z danymi, po czym odsyłam całą jego zawartość do użytkownika webserwisu. Oczywiście dla takiej funkcjonalności parsowanie pliku jest trochę przerostem formy nad treścią, ale jest to dobra baza pod to by w przyszłości wprowadzić w tej metodzie paginację, wyszukiwanie i inne zaawansowane funkcje.
void DrugsHandler::onRequest(const Net::Rest::Request& request, Net::Http::ResponseWriter response) {
Document drugs, config;
char _drugs_buffer[65536], _config_buffer[65536], _files_path_buffer[65536];
StringBuffer drugs_buffer;
FILE* config_pointer = fopen("config.json", "r");
FileReadStream config_stream(config_pointer, _config_buffer, sizeof(_config_buffer));
config.ParseStream(config_stream);
fclose(config_pointer);
if (config.HasMember("files_path")) {
sprintf(_files_path_buffer, "%s/drugs.json", config["files_path"].GetString());
FILE* drugs_pointer = fopen(_files_path_buffer, "r");
if (drugs_pointer) {
FileReadStream drugs_stream(drugs_pointer, _drugs_buffer, sizeof(_drugs_buffer));
drugs.ParseStream(drugs_stream);
fclose(drugs_pointer);
Writer<StringBuffer> writer(drugs_buffer);
drugs.Accept(writer);
response.send(Http::Code::Ok, drugs_buffer.GetString());
} else {
response.send(Http::Code::Internal_Server_Error);
}
} else {
response.send(Http::Code::Internal_Server_Error);
}
}
Pokazane w tym wpisie przykłady są zaczerpnięte z aplikacji DDS.