36 #ifndef QUERY_JSONPOINTER_HPP_ 37 #define QUERY_JSONPOINTER_HPP_ 39 #include "../Helper/Json.hpp" 40 #include "../Helper/Strings.hpp" 41 #include "../Main/Exception.hpp" 43 #include "../_extern/rapidjson/include/rapidjson/document.h" 44 #include "../_extern/rapidjson/include/rapidjson/pointer.h" 73 JsonPointer(
const std::string& pointerString,
bool textOnlyQuery);
79 [[nodiscard]]
bool getBool(
const rapidjson::Document& doc)
const;
80 void getFirst(
const rapidjson::Document& doc, std::string& resultTo)
const;
81 void getAll(
const rapidjson::Document& doc, std::vector<std::string>& resultTo)
const;
82 void getSubSets(
const rapidjson::Document& doc, std::vector<rapidjson::Document>& resultTo)
const;
100 rapidjson::Pointer pointerFirst;
101 std::string pointerStringMulti;
129 std::string
string{pointerString};
134 throw Exception(
"No JSONPointer string given");
138 if(
string.find(
"$$") != std::string::npos) {
139 this->pointerStringMulti = string;
142 if(this->pointerStringMulti.empty()) {
143 this->pointerFirst = rapidjson::Pointer(
string);
145 if(!(this->pointerFirst.IsValid())) {
152 this->pointerFirst = rapidjson::Pointer(
string);
154 if(!(this->pointerFirst.IsValid())) {
176 if(doc.HasParseError()) {
180 if(!(this->pointerFirst.IsValid())) {
185 return this->pointerFirst.Get(doc) !=
nullptr;
216 if(doc.HasParseError()) {
220 if(!(this->pointerFirst.IsValid())) {
225 const auto * match{this->pointerFirst.Get(doc)};
228 if(match !=
nullptr) {
230 if(match->IsString()) {
231 resultTo = std::string(match->GetString(), match->GetStringLength());
233 else if(match->IsArray() && !(this->textOnly)) {
234 const auto& iterator{match->GetArray().Begin()};
236 if(iterator !=
nullptr) {
237 if(iterator->IsString()) {
238 resultTo = std::string(iterator->GetString(), iterator->GetStringLength());
275 inline void JsonPointer::getAll(
const rapidjson::Document& doc, std::vector<std::string>& resultTo)
const {
280 if(doc.HasParseError()) {
284 if(!(this->pointerFirst.IsValid())) {
289 if(this->pointerStringMulti.empty()) {
291 const auto * match{this->pointerFirst.Get(doc)};
294 if(match !=
nullptr) {
296 if(match->IsArray() && !(this->textOnly)) {
298 resultTo.reserve(match->GetArray().Size());
301 for(
const auto& member : match->GetArray()) {
303 if(member.IsString()) {
304 resultTo.emplace_back(member.GetString(), member.GetStringLength());
313 else if(match->IsString()) {
314 resultTo.emplace_back(match->GetString(), match->GetStringLength());
324 std::size_t counter{};
327 std::string pointerString(this->pointerStringMulti);
331 const rapidjson::Pointer pointer{pointerString};
333 if(!(pointer.IsValid())) {
337 const auto * match{pointer.Get(doc)};
339 if(match ==
nullptr) {
344 if(match->IsString()) {
345 resultTo.emplace_back(match->GetString(), match->GetStringLength());
387 if(doc.HasParseError()) {
391 if(!(this->pointerFirst.IsValid())) {
396 if(this->pointerStringMulti.empty()) {
398 const auto * match{this->pointerFirst.Get(doc)};
401 if(match !=
nullptr) {
403 if(match->IsArray() && !(this->textOnly)) {
405 resultTo.reserve(match->GetArray().Size());
408 for(
const auto& member : match->GetArray()) {
410 resultTo.emplace_back();
413 resultTo.back().CopyFrom(member, resultTo.back().GetAllocator());
418 resultTo.emplace_back();
421 resultTo.back().CopyFrom(*match, resultTo.back().GetAllocator());
427 std::size_t counter{};
432 std::string pointerString{this->pointerStringMulti};
438 const rapidjson::Pointer pointer{pointerString};
440 if(!(pointer.IsValid())) {
442 "Invalid JSONPointer '" 443 + pointerString +
"'" 448 const auto * match{pointer.Get(doc)};
450 if(match ==
nullptr || match->IsNull()) {
455 resultTo.emplace_back();
458 resultTo.back().CopyFrom(*match, resultTo.back().GetAllocator());
Class for JSONPointer exceptions.
Definition: JsonPointer.hpp:97
JsonPointer(const std::string &pointerString, bool textOnlyQuery)
Constructor setting a JSONPointer string and whether the result should be text-only.
Definition: JsonPointer.hpp:127
void getAll(const rapidjson::Document &doc, std::vector< std::string > &resultTo) const
Gets all matches from performing the query on a parsed JSON document.
Definition: JsonPointer.hpp:275
#define MAIN_EXCEPTION_CLASS()
Macro used to easily define classes for general exceptions.
Definition: Exception.hpp:50
void trim(std::string &stringToTrim)
Removes whitespaces around a string.
Definition: Strings.hpp:360
void getFirst(const rapidjson::Document &doc, std::string &resultTo) const
Gets the first match from performing the query on a parsed JSON document.
Definition: JsonPointer.hpp:211
void replaceAll(std::string &strInOut, std::string_view needle, std::string_view replacement)
Replaces all occurences within a string with another string.
Definition: Strings.hpp:246
void getSubSets(const rapidjson::Document &doc, std::vector< rapidjson::Document > &resultTo) const
Gets all matching subsets from performing the query on a parsed JSON document.
Definition: JsonPointer.hpp:382
Namespace for classes handling queries.
Definition: XML.hpp:51
Implements an extended JSONPointer query using the rapidJSON library.
Definition: JsonPointer.hpp:68
bool getBool(const rapidjson::Document &doc) const
Gets a boolean result from performing the query on a parsed JSON document.
Definition: JsonPointer.hpp:174
std::string stringify(const std::vector< std::string > &vectorToStringify)
Stringifies a vector of strings into one string containing a JSON array.
Definition: Json.hpp:158