83 lines
2.2 KiB
C++
83 lines
2.2 KiB
C++
#pragma once
|
|
#include "json_common.hpp"
|
|
#include "duckdb/common/serializer/deserializer.hpp"
|
|
|
|
namespace duckdb {
|
|
|
|
class JsonDeserializer : public Deserializer {
|
|
public:
|
|
JsonDeserializer(yyjson_val *val, const yyjson_doc_ptr &doc) : doc(doc.get()) {
|
|
deserialize_enum_from_string = true;
|
|
stack.emplace_back(val);
|
|
}
|
|
|
|
private:
|
|
struct StackFrame {
|
|
yyjson_val *val;
|
|
yyjson_arr_iter arr_iter;
|
|
explicit StackFrame(yyjson_val *val) : val(val) {
|
|
yyjson_arr_iter_init(val, &arr_iter);
|
|
}
|
|
};
|
|
|
|
yyjson_doc *doc;
|
|
const char *current_tag = nullptr;
|
|
vector<StackFrame> stack;
|
|
|
|
void DumpDoc();
|
|
void DumpCurrent();
|
|
void Dump(yyjson_mut_val *val);
|
|
void Dump(yyjson_val *val);
|
|
|
|
// Get the current json value
|
|
inline StackFrame &Current() {
|
|
return stack.back();
|
|
};
|
|
|
|
inline void Push(yyjson_val *val) {
|
|
stack.emplace_back(val);
|
|
}
|
|
inline void Pop() {
|
|
stack.pop_back();
|
|
}
|
|
yyjson_val *GetNextValue();
|
|
|
|
void ThrowTypeError(yyjson_val *val, const char *expected);
|
|
|
|
//===--------------------------------------------------------------------===//
|
|
// Nested Types Hooks
|
|
//===--------------------------------------------------------------------===//
|
|
void OnPropertyBegin(const field_id_t field_id, const char *tag) final;
|
|
void OnPropertyEnd() final;
|
|
bool OnOptionalPropertyBegin(const field_id_t field_id, const char *tag) final;
|
|
void OnOptionalPropertyEnd(bool present) final;
|
|
|
|
void OnObjectBegin() final;
|
|
void OnObjectEnd() final;
|
|
idx_t OnListBegin() final;
|
|
void OnListEnd() final;
|
|
bool OnNullableBegin() final;
|
|
void OnNullableEnd() final;
|
|
|
|
//===--------------------------------------------------------------------===//
|
|
// Primitive Types
|
|
//===--------------------------------------------------------------------===//
|
|
bool ReadBool() final;
|
|
int8_t ReadSignedInt8() final;
|
|
uint8_t ReadUnsignedInt8() final;
|
|
int16_t ReadSignedInt16() final;
|
|
uint16_t ReadUnsignedInt16() final;
|
|
int32_t ReadSignedInt32() final;
|
|
uint32_t ReadUnsignedInt32() final;
|
|
int64_t ReadSignedInt64() final;
|
|
uint64_t ReadUnsignedInt64() final;
|
|
float ReadFloat() final;
|
|
double ReadDouble() final;
|
|
string ReadString() final;
|
|
hugeint_t ReadHugeInt() final;
|
|
uhugeint_t ReadUhugeInt() final;
|
|
void ReadDataPtr(data_ptr_t &ptr, idx_t count) final;
|
|
};
|
|
|
|
} // namespace duckdb
|