11#include <initializer_list>
26 using Array = std::vector<Json>;
27 using Object = std::vector<std::pair<std::string, Json>>;
35 Json(
bool new_value) : value(new_value) {}
36 template <
typename Int,
typename = std::enable_if_t<std::is_
integral_v<Int> && !std::is_same_v<Int,
bool>>>
37 Json(Int new_value) : value(double(new_value)) {}
38 Json(
double new_value) : value(new_value) {}
39 Json(
float new_value) : value(double(new_value)) {}
40 Json(
const char* new_value) : value(std::string(new_value)) {}
41 Json(
const std::string& new_value) : value(new_value) {}
42 Json(std::string_view new_value) : value(std::string(new_value)) {}
45 bool is_null() const noexcept {
return std::holds_alternative<std::monostate>(value); }
46 bool is_bool() const noexcept {
return std::holds_alternative<bool>(value); }
47 bool is_number() const noexcept {
return std::holds_alternative<double>(value); }
48 bool is_string() const noexcept {
return std::holds_alternative<std::string>(value); }
49 bool is_array() const noexcept {
return std::holds_alternative<Array>(value); }
50 bool is_object() const noexcept {
return std::holds_alternative<Object>(value); }
55 bool has(std::string_view key)
const {
return find(key) !=
nullptr; }
57 const Json&
at(std::string_view)
const;
66 std::string
dump(
int indent = 2)
const;
69 using Value = std::variant<std::monostate, bool, double, std::string, Array, Object>;
79 void load(
const std::filesystem::path&);
80 void save(
const std::filesystem::path&,
int indent = 2)
const;
103 template <
typename Value>
109 std::string
c_str(
int indent = 2)
const {
return root.dump(indent); }
115 std::vector<Json*> stack;
117template <
typename Value>
120 writer.
add_field(name, std::forward<Value>(value));
125template <
typename Serializable>
126void save_json_file(
const std::filesystem::path& file_name,
const Serializable& serializable)
129 serializable.to_JSON(writer);
134 std::initializer_list<std::pair<const char*, Json>>);
147 std::initializer_list<std::string_view>);
151template <
typename Range>
155 if constexpr (
requires { std::size(values); })
156 array.as_array().reserve(std::size(values));
157 for (
const auto& value : values)
162template<
typename Func>
166 throw std::runtime_error(std::format(
"Missing JSON parent for: {}", tag));
168 const Json*
const arr = parent->
find(tag);
170 throw std::runtime_error(std::format(
"Missing or wrong-size JSON array: {}", tag));
172 for (std::size_t i = 0; i < count; ++i)
void set_root(Json new_root)
Definition json.h:81
const Json & get_root() const noexcept
Definition json.h:83
void save(const std::filesystem::path &, int indent=2) const
void load(const std::filesystem::path &)
const Json * first_child(std::string_view name) const
Definition json.h:84
static JsonDocument wrap(std::string_view, Json)
const Json * first_child() const noexcept
Definition json.h:85
Json & get_root() noexcept
Definition json.h:82
void end_array()
Definition json.h:98
void close_element()
Definition json.h:95
void begin_array_object()
void add_field(std::string_view, Json)
void end_array_object()
Definition json.h:100
void begin_array(std::string_view)
void add_field(std::string_view name, Value &&value)
Definition json.h:104
void open_element(std::string_view)
std::string c_str(int indent=2) const
Definition json.h:109
const Json & at(std::string_view) const
static Json parse(std::string_view)
Json(const std::string &new_value)
Definition json.h:41
Json & operator[](std::string_view)
bool is_array() const noexcept
Definition json.h:49
Json(bool new_value)
Definition json.h:35
Json(std::string_view new_value)
Definition json.h:42
bool has(std::string_view key) const
Definition json.h:55
bool is_null() const noexcept
Definition json.h:45
bool is_bool() const noexcept
Definition json.h:46
bool is_number() const noexcept
Definition json.h:47
std::string dump(int indent=2) const
long long as_long() const
Json(double new_value)
Definition json.h:38
Json(Int new_value)
Definition json.h:37
bool is_object() const noexcept
Definition json.h:50
const Json * find(std::string_view) const
std::vector< std::pair< std::string, Json > > Object
Definition json.h:27
Kind get_kind() const noexcept
Definition json.h:44
bool is_string() const noexcept
Definition json.h:48
Json(float new_value)
Definition json.h:39
static Json make_object()
const Object & as_object() const
Json(const char *new_value)
Definition json.h:40
std::vector< Json > Array
Definition json.h:26
Json & set(std::string_view, Json)
std::string as_string() const
@ String
Definition json.h:29
@ Number
Definition json.h:29
@ Null
Definition json.h:29
@ Bool
Definition json.h:29
const Array & as_array() const
Definition configuration.h:10
Json json_array(const Range &values)
Definition json.h:152
std::string read_json_string_fallback(const Json *, std::initializer_list< std::string_view >)
void write_json(JsonWriter &, std::initializer_list< std::pair< const char *, Json > >)
void for_json_items(const Json *parent, const char *tag, std::size_t count, Func func)
Definition json.h:163
void add_json_field(JsonWriter &writer, std::string_view name, Value &&value)
Definition json.h:118
Eigen::array< T, N > array
Definition tensor_types.h:736
bool read_json_bool(const Json *, std::string_view)
std::string read_json_string(const Json *, std::string_view)
std::vector< std::string > read_json_strings(const Json *, std::string_view)
long long read_json_index(const Json *, std::string_view)
const Json * get_json_root(const JsonDocument &, std::string_view)
void save_json_file(const std::filesystem::path &, const JsonWriter &)
const Json * require_json_field(const Json *, std::string_view)
JsonDocument load_json_file(const std::filesystem::path &)
float read_json_float(const Json *, std::string_view)