OpenNN
Open-source neural networks library
Loading...
Searching...
No Matches
json.h
Go to the documentation of this file.
1// OpenNN: Open Neural Networks Library
2// www.opennn.net
3//
4// J S O N M I N I M A L S U P P O R T
5//
6// Artificial Intelligence Techniques SL
7// artelnics@artelnics.com
8
9#pragma once
10
11#include <filesystem>
12#include <initializer_list>
13#include <stdexcept>
14#include <string>
15#include <utility>
16#include <vector>
17#include <format>
18
19namespace opennn
20{
21
22class Json
23{
24public:
25 enum class Kind { Null, Bool, Number, String, Array, Object };
26
28 bool bool_value = false;
29 double number_value = 0.0;
31 vector<Json> array_value;
32 vector<pair<string, Json>> object_value;
33
34 Json() = default;
35 Json(bool b) : kind(Kind::Bool), bool_value(b) {}
36 Json(int i) : kind(Kind::Number), number_value(i) {}
37 Json(long i) : kind(Kind::Number), number_value(double(i)) {}
38 Json(long long i) : kind(Kind::Number), number_value(double(i)) {}
39 Json(unsigned int i) : kind(Kind::Number), number_value(double(i)) {}
40 Json(unsigned long i) : kind(Kind::Number), number_value(double(i)) {}
41 Json(unsigned long long i) : kind(Kind::Number), number_value(double(i)) {}
42 Json(double d) : kind(Kind::Number), number_value(d) {}
43 Json(float d) : kind(Kind::Number), number_value(double(d)) {}
44 Json(const char* s) : kind(Kind::String), string_value(s) {}
45 Json(const string& s) : kind(Kind::String), string_value(s) {}
46
47 [[nodiscard]] static Json make_object();
48 [[nodiscard]] static Json make_array();
49
50 [[nodiscard]] bool is_null() const { return kind == Kind::Null; }
51 [[nodiscard]] bool is_bool() const { return kind == Kind::Bool; }
52 [[nodiscard]] bool is_number() const { return kind == Kind::Number; }
53 [[nodiscard]] bool is_string() const { return kind == Kind::String; }
54 [[nodiscard]] bool is_array() const { return kind == Kind::Array; }
55 [[nodiscard]] bool is_object() const { return kind == Kind::Object; }
56 [[nodiscard]] bool has(const string& key) const;
57 [[nodiscard]] const Json* find(const string& key) const;
58 [[nodiscard]] const Json* first_child(const string& key) const { return find(key); }
59 [[nodiscard]] const Json& at(const string& key) const;
60 Json& operator[](const string& key);
61 Json& set(const string& key, Json value);
62 void push_back(Json value);
63 [[nodiscard]] string as_string() const;
64 [[nodiscard]] long as_long() const;
65 [[nodiscard]] double as_double() const;
66 [[nodiscard]] bool as_bool() const;
67 [[nodiscard]] static Json parse(const string& text);
68 [[nodiscard]] string dump(int indent = 2) const;
69};
70
72{
73public:
75
76 void load(const filesystem::path& path);
77 void save(const filesystem::path& path, int indent = 2) const;
78 [[nodiscard]] const Json* first_child(const string& name) const;
79 [[nodiscard]] const Json* first_child() const { return &root; }
80 [[nodiscard]] static JsonDocument wrap(const string& tag, Json value);
81};
82
83// Incremental writer (mirrors the old XmlPrinter API). Only one root object.
85{
86public:
87 void open_element(const string& name);
89
90 void begin_array(const string& name);
91 void end_array();
94 void add_field(const string& name, const string& value);
95
96 [[nodiscard]] string c_str(int indent = 2) const;
97
98private:
99 Json root;
100 vector<Json*> stack; // path of containers currently open
101 vector<string> name_stack; // for opened named scalar/object
102};
104 const string& name,
105 const string& value);
106
108 initializer_list<pair<const char*, string>> props);
109[[nodiscard]] float read_json_type (const Json* root, const string& field);
110[[nodiscard]] long read_json_index (const Json* root, const string& field);
111[[nodiscard]] bool read_json_bool (const Json* root, const string& field);
112[[nodiscard]] string read_json_string (const Json* root, const string& field);
113
114[[nodiscard]] string read_json_string_fallback(const Json* root,
115 initializer_list<string> names);
116
117[[nodiscard]] const Json* require_json_field(const Json* root, const string& field);
118
119template<typename Func>
120void for_json_items(const Json* parent, const char* tag, long count, Func func)
121{
122 if (!parent || !parent->is_object())
123 throw runtime_error(format("Missing JSON parent for: {}", tag));
124
125 const Json* arr = parent->find(tag);
126 if (!arr || !arr->is_array() || long(arr->array_value.size()) != count)
127 throw runtime_error(format("Missing or wrong-size JSON array: {}", tag));
128
129 for (long i = 0; i < count; i++)
130 func(i, &arr->array_value[size_t(i)]);
131}
132
133[[nodiscard]] JsonDocument load_json_file(const filesystem::path& file_name);
134[[nodiscard]] const Json* get_json_root (const JsonDocument& document, const string& tag);
135
136}
Definition json.h:72
void load(const filesystem::path &path)
void save(const filesystem::path &path, int indent=2) const
static JsonDocument wrap(const string &tag, Json value)
Json root
Definition json.h:74
const Json * first_child() const
Definition json.h:79
const Json * first_child(const string &name) const
Definition json.h:85
void add_field(const string &name, const string &value)
string c_str(int indent=2) const
void open_element(const string &name)
void begin_array(const string &name)
Definition json.h:23
Json(const char *s)
Definition json.h:44
Json & operator[](const string &key)
Kind kind
Definition json.h:27
bool has(const string &key) const
bool is_number() const
Definition json.h:52
static Json make_array()
const Json * find(const string &key) const
Json(float d)
Definition json.h:43
string dump(int indent=2) const
string string_value
Definition json.h:30
Json(bool b)
Definition json.h:35
bool is_array() const
Definition json.h:54
Json & set(const string &key, Json value)
Json(long long i)
Definition json.h:38
vector< pair< string, Json > > object_value
Definition json.h:32
string as_string() const
bool is_object() const
Definition json.h:55
Json(long i)
Definition json.h:37
bool bool_value
Definition json.h:28
long as_long() const
vector< Json > array_value
Definition json.h:31
double as_double() const
Json(const string &s)
Definition json.h:45
Json(double d)
Definition json.h:42
Json(unsigned int i)
Definition json.h:39
bool as_bool() const
const Json & at(const string &key) const
Json(int i)
Definition json.h:36
static Json parse(const string &text)
static Json make_object()
double number_value
Definition json.h:29
const Json * first_child(const string &key) const
Definition json.h:58
void push_back(Json value)
bool is_bool() const
Definition json.h:51
bool is_string() const
Definition json.h:53
bool is_null() const
Definition json.h:50
Kind
Definition json.h:25
@ String
Definition json.h:25
@ Array
Definition json.h:25
@ Object
Definition json.h:25
@ Number
Definition json.h:25
@ Null
Definition json.h:25
@ Bool
Definition json.h:25
Json(unsigned long i)
Definition json.h:40
Json()=default
Json(unsigned long long i)
Definition json.h:41
Definition adaptive_moment_estimation.h:14
const Json * get_json_root(const JsonDocument &document, const string &tag)
void add_json_field(JsonWriter &writer, const string &name, const string &value)
long read_json_index(const Json *root, const string &field)
JsonDocument load_json_file(const filesystem::path &file_name)
const Json * require_json_field(const Json *root, const string &field)
string read_json_string_fallback(const Json *root, initializer_list< string > names)
void for_json_items(const Json *parent, const char *tag, long count, Func func)
Definition json.h:120
string read_json_string(const Json *root, const string &field)
void write_json(JsonWriter &writer, initializer_list< pair< const char *, string > > props)
bool read_json_bool(const Json *root, const string &field)
float read_json_type(const Json *root, const string &field)