Add array_at method to get array from JSON (#24671)

Signed-off-by: yah01 <yang.cen@zilliz.com>
This commit is contained in:
yah01 2023-06-06 14:10:36 +08:00 committed by GitHub
parent c9d9940918
commit f40e22c78c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -29,8 +29,11 @@
#include "simdjson.h" #include "simdjson.h"
#include "fmt/core.h" #include "fmt/core.h"
#include "simdjson/common_defs.h" #include "simdjson/common_defs.h"
#include "simdjson/dom/array.h"
#include "simdjson/dom/document.h"
#include "simdjson/dom/element.h" #include "simdjson/dom/element.h"
#include "simdjson/error.h" #include "simdjson/error.h"
#include "simdjson/padded_string.h"
namespace milvus { namespace milvus {
using document = simdjson::ondemand::document; using document = simdjson::ondemand::document;
@ -108,6 +111,20 @@ class Json {
return doc; return doc;
} }
value_result<simdjson::dom::element>
dom_doc() const {
thread_local simdjson::dom::parser parser;
// it's always safe to add the padding,
// as we have allocated the memory with this padding
auto doc = parser.parse(data_);
AssertInfo(doc.error() == simdjson::SUCCESS,
fmt::format("failed to parse the json {}: {}",
data_,
simdjson::error_message(doc.error())));
return doc;
}
bool bool
exist(std::string_view pointer) const { exist(std::string_view pointer) const {
return doc().at_pointer(pointer).error() == simdjson::SUCCESS; return doc().at_pointer(pointer).error() == simdjson::SUCCESS;
@ -130,6 +147,15 @@ class Json {
return doc().at_pointer(pointer).get<T>(); return doc().at_pointer(pointer).get<T>();
} }
// get dom array by JSON pointer,
// call `size()` to get array size,
// call `at()` to get array element by index,
// iterate through array elements by iterator.
value_result<simdjson::dom::array>
array_at(std::string_view pointer) const {
return dom_doc().at_pointer(pointer).get_array();
}
std::string_view std::string_view
data() const { data() const {
return data_; return data_;