#include "json-helpers.hpp" #ifdef JSONPATH_SUPPORT #include #include #endif #include #include namespace advss { QString FormatJsonString(std::string s) { return FormatJsonString(QString::fromStdString(s)); } QString FormatJsonString(QString json) { QJsonDocument doc = QJsonDocument::fromJson(json.toUtf8()); if (doc.isNull()) { return ""; } return QString::fromUtf8(doc.toJson(QJsonDocument::Indented)); } bool MatchJson(const std::string &json1, const std::string &json2, const RegexConfig ®ex) { auto j1 = FormatJsonString(json1).toStdString(); auto j2 = FormatJsonString(json2).toStdString(); if (j1.empty()) { j1 = json1; } if (j2.empty()) { j2 = json2; } if (regex.Enabled()) { return regex.Matches(j1, j2); } return j1 == j2; } std::optional GetJsonField(const std::string &jsonStr, const std::string &fieldToExtract) { try { nlohmann::json json = nlohmann::json::parse(jsonStr); auto it = json.find(fieldToExtract); if (it == json.end()) { return {}; } if (it->is_string()) { return it->get(); } return it->dump(); } catch (const nlohmann::json::exception &) { return {}; } return {}; } std::optional QueryJson(const std::string &jsonStr, const std::string &query) { #ifdef JSONPATH_SUPPORT try { auto json = jsoncons::json::parse(jsonStr); auto result = jsoncons::jsonpath::json_query(json, query); return result.as_string(); } catch (const jsoncons::json_exception &) { return {}; } catch (const jsoncons::json_errc &) { return {}; } #else return {}; #endif } std::optional AccessJsonArrayIndex(const std::string &jsonStr, const int index) { try { nlohmann::json json = nlohmann::json::parse(jsonStr); if (!json.is_array() || index >= (int)json.size() || index < 0) { return {}; } auto result = json.at(index); if (result.is_string()) { return result.get(); } return result.dump(); } catch (const nlohmann::json::exception &) { return {}; } return {}; } } // namespace advss