mirror of
https://github.com/simdjson/simdjson
synced 2026-06-08 17:27:07 +00:00
c066b5421b
* Add support for JSONPath with '$' prefix and integrate into dom::at_path (#2266) - Updated `json_path_to_pointer_conversion` to support JSONPath starting with the '$' prefix, while maintaining compatibility with the existing implementation. - Moved `json_path_to_pointer_conversion` to a separate header file for better modularity and to support JSONPath queries in `dom` mode. - Implemented `at_path` functionality in `dom` mode to enable querying JSON using JSONPath. - Added unit tests to validate the new JSONPath support in `dom` mode and ensure compatibility with both standard and existing JSONPath formats. * two minor fixes * more tests and documentation * damn compiler warnings * more documentation fixes --------- Co-authored-by: Zhengguo Yang <yangzhgg@gmail.com>
64 lines
1.7 KiB
C++
64 lines
1.7 KiB
C++
#ifndef SIMDJSON_JSONPATHUTIL_H
|
|
#define SIMDJSON_JSONPATHUTIL_H
|
|
|
|
#include <string>
|
|
#include <string_view>
|
|
|
|
namespace simdjson {
|
|
/**
|
|
* Converts JSONPath to JSON Pointer.
|
|
* @param json_path The JSONPath string to be converted.
|
|
* @return A string containing the equivalent JSON Pointer.
|
|
*/
|
|
inline std::string json_path_to_pointer_conversion(std::string_view json_path) {
|
|
size_t i = 0;
|
|
|
|
// if JSONPath starts with $, skip it
|
|
if (!json_path.empty() && json_path.front() == '$') {
|
|
i = 1;
|
|
}
|
|
if (json_path.empty() || (json_path[i] != '.' &&
|
|
json_path[i] != '[')) {
|
|
return "-1"; // This is just a sentinel value, the caller should check for this and return an error.
|
|
}
|
|
|
|
std::string result;
|
|
// Reserve space to reduce allocations, adjusting for potential increases due
|
|
// to escaping.
|
|
result.reserve(json_path.size() * 2);
|
|
|
|
while (i < json_path.length()) {
|
|
if (json_path[i] == '.') {
|
|
result += '/';
|
|
} else if (json_path[i] == '[') {
|
|
result += '/';
|
|
++i; // Move past the '['
|
|
while (i < json_path.length() && json_path[i] != ']') {
|
|
if (json_path[i] == '~') {
|
|
result += "~0";
|
|
} else if (json_path[i] == '/') {
|
|
result += "~1";
|
|
} else {
|
|
result += json_path[i];
|
|
}
|
|
++i;
|
|
}
|
|
if (i == json_path.length() || json_path[i] != ']') {
|
|
return "-1"; // Using sentinel value that will be handled as an error by the caller.
|
|
}
|
|
} else {
|
|
if (json_path[i] == '~') {
|
|
result += "~0";
|
|
} else if (json_path[i] == '/') {
|
|
result += "~1";
|
|
} else {
|
|
result += json_path[i];
|
|
}
|
|
}
|
|
++i;
|
|
}
|
|
|
|
return result;
|
|
}
|
|
} // namespace simdjson
|
|
#endif // SIMDJSON_JSONPATHUTIL_H
|