29#include <initializer_list>
47class NEOGRAPH_API json {
50 class exception :
public std::runtime_error {
52 using std::runtime_error::runtime_error;
54 class parse_error :
public exception {
56 using exception::exception;
58 class type_error :
public exception {
60 using exception::exception;
62 class out_of_range :
public exception {
64 using exception::exception;
74 json(
unsigned long i);
76 json(
unsigned long long i);
80 json(
const std::string& s);
81 json(std::string_view s);
82 json(
const std::vector<std::string>& v);
84 json(std::initializer_list<json> il);
87 json(
const json& other);
88 json(json&& other)
noexcept;
89 json& operator=(
const json& other) &;
90 json& operator=(json&& other) &
noexcept;
93 json& operator=(
const json& other) &&;
94 json& operator=(json&& other) &&
noexcept;
101 static json array(std::initializer_list<json> il);
107 static constexpr std::size_t max_parse_depth = 256;
111 static json parse(std::string_view s);
112 static json parse(std::istream& in);
117 static json parse(std::string_view s, std::size_t max_depth);
118 static json parse(std::istream& in, std::size_t max_depth);
121 bool is_null() const noexcept;
122 bool is_boolean() const noexcept;
123 bool is_bool() const noexcept {
return is_boolean(); }
124 bool is_number() const noexcept;
125 bool is_number_integer() const noexcept;
126 bool is_number_unsigned() const noexcept;
127 bool is_number_float() const noexcept;
128 bool is_string() const noexcept;
129 bool is_array() const noexcept;
130 bool is_object() const noexcept;
131 bool is_primitive() const noexcept;
134 size_t size() const noexcept;
135 bool empty() const noexcept;
138 json operator[](const
char* key);
139 json operator[](const std::
string& key);
140 json operator[](
size_t idx);
141 json operator[](
int idx) {
return (*
this)[
static_cast<size_t>(idx)]; }
144 json operator[](
const char* key)
const;
145 json operator[](
const std::string& key)
const;
146 json operator[](
size_t idx)
const;
147 json operator[](
int idx)
const {
return (*
this)[
static_cast<size_t>(idx)]; }
150 json at(
const char* key);
151 json at(
const std::string& key);
153 json at(
int idx) {
return at(
static_cast<size_t>(idx)); }
154 json at(
const char* key)
const;
155 json at(
const std::string& key)
const;
156 json at(
size_t idx)
const;
157 json at(
int idx)
const {
return at(
static_cast<size_t>(idx)); }
167 bool contains(
const char* key)
const;
168 bool contains(
const std::string& key)
const;
171 template <
typename T> T get()
const;
174 template <
typename T> T value(
const std::string& key,
const T& default_val)
const;
175 std::string value(
const std::string& key,
const char* default_val)
const;
178 void push_back(
const json& v);
179 void push_back(json&& v);
182 std::string dump(
int indent = -1)
const;
185 bool operator==(
const json& other)
const;
186 bool operator!=(
const json& other)
const {
return !(*
this == other); }
189 class NEOGRAPH_API iterator {
191 iterator() =
default;
192 json operator*()
const;
193 iterator& operator++();
194 bool operator!=(
const iterator& o)
const {
return !(*
this == o); }
195 bool operator==(
const iterator& o)
const {
197 if (done_ && o.done_)
return parent_ == o.parent_;
198 return parent_ == o.parent_ && idx_ == o.idx_ && done_ == o.done_;
202 std::string key()
const;
207 std::shared_ptr<yyjson_mut_doc> doc_;
208 yyjson_mut_val* parent_ =
nullptr;
209 std::vector<yyjson_mut_val*> keys_;
210 std::vector<yyjson_mut_val*> vals_;
212 bool is_object_ =
false;
216 iterator begin()
const;
217 iterator end()
const;
220 iterator find(
const std::string& key)
const;
221 iterator find(
const char* key)
const;
225 items_proxy items()
const;
228 yyjson_mut_doc* raw_doc()
const {
return doc_.get(); }
229 yyjson_mut_val* raw_val()
const {
return val_; }
233 std::shared_ptr<yyjson_mut_doc> doc_;
234 yyjson_mut_val* val_ =
nullptr;
239 yyjson_mut_val* parent_ =
nullptr;
240 bool parent_is_array_ =
false;
241 std::string parent_key_;
242 size_t parent_idx_ = 0;
245 json(std::shared_ptr<yyjson_mut_doc> doc, yyjson_mut_val* val);
250 std::shared_ptr<yyjson_mut_doc> doc,
252 yyjson_mut_val* parent,
255 std::shared_ptr<yyjson_mut_doc> doc,
257 yyjson_mut_val* parent,
261 void ensure_own_doc();
265 void write_through(yyjson_mut_val* src_val, yyjson_mut_doc* src_doc);
268 void reset_to(yyjson_mut_val* v);
271 static std::shared_ptr<yyjson_mut_doc> make_doc();
273 friend void to_json_forwarding(json& j,
const json& v);
275 friend class detail::JsonBuilder;
279class NEOGRAPH_API json::items_proxy {
281 explicit items_proxy(
const json& j) : j_(j) {}
282 class NEOGRAPH_API iterator {
284 iterator() =
default;
285 std::pair<std::string, json> operator*()
const {
286 return {it_.key(), it_.value()};
288 iterator& operator++() { ++it_;
return *
this; }
289 bool operator!=(
const iterator& o)
const {
return it_ != o.it_; }
290 bool operator==(
const iterator& o)
const {
return it_ == o.it_; }
292 friend class items_proxy;
295 iterator begin()
const { iterator it; it.it_ = j_.begin();
return it; }
296 iterator end()
const { iterator it; it.it_ = j_.end();
return it; }
301inline json::items_proxy json::items()
const {
return items_proxy{*
this}; }
304inline void to_json(json& j,
const json& v) { j = v; }
305inline void from_json(
const json& j, json& v) { v = j; }
308inline std::ostream& operator<<(std::ostream& os,
const json& j) {
309 return os << j.dump();
323template <> NEOGRAPH_API json json::get<json>()
const;
324template <> NEOGRAPH_API std::string json::get<std::string>()
const;
326template <> NEOGRAPH_API std::string_view json::get<std::string_view>()
const;
327template <> NEOGRAPH_API
bool json::get<bool>()
const;
328template <> NEOGRAPH_API
int json::get<int>()
const;
329template <> NEOGRAPH_API
unsigned json::get<unsigned>()
const;
330template <> NEOGRAPH_API
long json::get<long>()
const;
331template <> NEOGRAPH_API
unsigned long json::get<unsigned long>()
const;
332template <> NEOGRAPH_API
long long json::get<long long>()
const;
333template <> NEOGRAPH_API
unsigned long long json::get<unsigned long long>()
const;
334template <> NEOGRAPH_API
double json::get<double>()
const;
335template <> NEOGRAPH_API
float json::get<float>()
const;
336template <> NEOGRAPH_API std::vector<std::string> json::get<std::vector<std::string>>()
const;
339T json::value(
const std::string& key,
const T& default_val)
const {
340 if (!is_object())
return default_val;
341 auto child = (*this)[key];
342 if (child.is_null())
return default_val;
344 return child.get<T>();
350inline std::string json::value(
const std::string& key,
const char* default_val)
const {
351 return value<std::string>(key, std::string(default_val));
NEOGRAPH_API export/import macro for shared-library builds.