28#include <initializer_list>
42class NEOGRAPH_API json {
45 class exception :
public std::runtime_error {
47 using std::runtime_error::runtime_error;
49 class parse_error :
public exception {
51 using exception::exception;
53 class type_error :
public exception {
55 using exception::exception;
57 class out_of_range :
public exception {
59 using exception::exception;
69 json(
unsigned long i);
71 json(
unsigned long long i);
75 json(
const std::string& s);
76 json(std::string_view s);
77 json(
const std::vector<std::string>& v);
79 json(std::initializer_list<json> il);
82 json(
const json& other);
83 json(json&& other)
noexcept;
84 json& operator=(
const json& other) &;
85 json& operator=(json&& other) &
noexcept;
88 json& operator=(
const json& other) &&;
89 json& operator=(json&& other) &&
noexcept;
96 static json array(std::initializer_list<json> il);
98 static json parse(std::string_view s);
99 static json parse(std::istream& in);
102 bool is_null() const noexcept;
103 bool is_boolean() const noexcept;
104 bool is_bool() const noexcept {
return is_boolean(); }
105 bool is_number() const noexcept;
106 bool is_number_integer() const noexcept;
107 bool is_number_unsigned() const noexcept;
108 bool is_number_float() const noexcept;
109 bool is_string() const noexcept;
110 bool is_array() const noexcept;
111 bool is_object() const noexcept;
112 bool is_primitive() const noexcept;
115 size_t size() const noexcept;
116 bool empty() const noexcept;
119 json operator[](const
char* key);
120 json operator[](const std::
string& key);
121 json operator[](
size_t idx);
122 json operator[](
int idx) {
return (*
this)[
static_cast<size_t>(idx)]; }
125 json operator[](
const char* key)
const;
126 json operator[](
const std::string& key)
const;
127 json operator[](
size_t idx)
const;
128 json operator[](
int idx)
const {
return (*
this)[
static_cast<size_t>(idx)]; }
131 json at(
const char* key);
132 json at(
const std::string& key);
134 json at(
int idx) {
return at(
static_cast<size_t>(idx)); }
135 json at(
const char* key)
const;
136 json at(
const std::string& key)
const;
137 json at(
size_t idx)
const;
138 json at(
int idx)
const {
return at(
static_cast<size_t>(idx)); }
148 bool contains(
const char* key)
const;
149 bool contains(
const std::string& key)
const;
152 template <
typename T> T get()
const;
155 template <
typename T> T value(
const std::string& key,
const T& default_val)
const;
156 std::string value(
const std::string& key,
const char* default_val)
const;
159 void push_back(
const json& v);
160 void push_back(json&& v);
163 std::string dump(
int indent = -1)
const;
166 bool operator==(
const json& other)
const;
167 bool operator!=(
const json& other)
const {
return !(*
this == other); }
170 class NEOGRAPH_API iterator {
172 iterator() =
default;
173 json operator*()
const;
174 iterator& operator++();
175 bool operator!=(
const iterator& o)
const {
return !(*
this == o); }
176 bool operator==(
const iterator& o)
const {
178 if (done_ && o.done_)
return parent_ == o.parent_;
179 return parent_ == o.parent_ && idx_ == o.idx_ && done_ == o.done_;
183 std::string key()
const;
188 std::shared_ptr<yyjson_mut_doc> doc_;
189 yyjson_mut_val* parent_ =
nullptr;
190 std::vector<yyjson_mut_val*> keys_;
191 std::vector<yyjson_mut_val*> vals_;
193 bool is_object_ =
false;
197 iterator begin()
const;
198 iterator end()
const;
201 iterator find(
const std::string& key)
const;
202 iterator find(
const char* key)
const;
206 items_proxy items()
const;
209 yyjson_mut_doc* raw_doc()
const {
return doc_.get(); }
210 yyjson_mut_val* raw_val()
const {
return val_; }
214 std::shared_ptr<yyjson_mut_doc> doc_;
215 yyjson_mut_val* val_ =
nullptr;
220 yyjson_mut_val* parent_ =
nullptr;
221 bool parent_is_array_ =
false;
222 std::string parent_key_;
223 size_t parent_idx_ = 0;
226 json(std::shared_ptr<yyjson_mut_doc> doc, yyjson_mut_val* val);
231 std::shared_ptr<yyjson_mut_doc> doc,
233 yyjson_mut_val* parent,
236 std::shared_ptr<yyjson_mut_doc> doc,
238 yyjson_mut_val* parent,
242 void ensure_own_doc();
246 void write_through(yyjson_mut_val* src_val, yyjson_mut_doc* src_doc);
249 void reset_to(yyjson_mut_val* v);
252 static std::shared_ptr<yyjson_mut_doc> make_doc();
254 friend void to_json_forwarding(json& j,
const json& v);
258class NEOGRAPH_API json::items_proxy {
260 explicit items_proxy(
const json& j) : j_(j) {}
261 class NEOGRAPH_API iterator {
263 iterator() =
default;
264 std::pair<std::string, json> operator*()
const {
265 return {it_.key(), it_.value()};
267 iterator& operator++() { ++it_;
return *
this; }
268 bool operator!=(
const iterator& o)
const {
return it_ != o.it_; }
269 bool operator==(
const iterator& o)
const {
return it_ == o.it_; }
271 friend class items_proxy;
274 iterator begin()
const { iterator it; it.it_ = j_.begin();
return it; }
275 iterator end()
const { iterator it; it.it_ = j_.end();
return it; }
280inline json::items_proxy json::items()
const {
return items_proxy{*
this}; }
283inline void to_json(json& j,
const json& v) { j = v; }
284inline void from_json(
const json& j, json& v) { v = j; }
287inline std::ostream& operator<<(std::ostream& os,
const json& j) {
288 return os << j.dump();
302template <> NEOGRAPH_API json json::get<json>()
const;
303template <> NEOGRAPH_API std::string json::get<std::string>()
const;
304template <> NEOGRAPH_API
bool json::get<bool>()
const;
305template <> NEOGRAPH_API
int json::get<int>()
const;
306template <> NEOGRAPH_API
unsigned json::get<unsigned>()
const;
307template <> NEOGRAPH_API
long json::get<long>()
const;
308template <> NEOGRAPH_API
unsigned long json::get<unsigned long>()
const;
309template <> NEOGRAPH_API
long long json::get<long long>()
const;
310template <> NEOGRAPH_API
unsigned long long json::get<unsigned long long>()
const;
311template <> NEOGRAPH_API
double json::get<double>()
const;
312template <> NEOGRAPH_API
float json::get<float>()
const;
313template <> NEOGRAPH_API std::vector<std::string> json::get<std::vector<std::string>>()
const;
316T json::value(
const std::string& key,
const T& default_val)
const {
317 if (!is_object())
return default_val;
318 auto child = (*this)[key];
319 if (child.is_null())
return default_val;
321 return child.get<T>();
327inline std::string json::value(
const std::string& key,
const char* default_val)
const {
328 return value<std::string>(key, std::string(default_val));
NEOGRAPH_API export/import macro for shared-library builds.