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
18namespace opennn
19{
20
21class Json
22{
23public:
24 enum class Kind { Null, Bool, Number, String, Array, Object };
25
27 bool bool_value = false;
28 double number_value = 0.0;
29 std::string string_value;
30 std::vector<Json> array_value;
31 std::vector<std::pair<std::string, Json>> object_value;
32
33 Json() = default;
34 Json(bool b) : kind(Kind::Bool), bool_value(b) {}
35 Json(int i) : kind(Kind::Number), number_value(i) {}
36 Json(long i) : kind(Kind::Number), number_value(double(i)) {}
37 Json(long long i) : kind(Kind::Number), number_value(double(i)) {}
38 Json(unsigned int i) : kind(Kind::Number), number_value(double(i)) {}
39 Json(unsigned long i) : kind(Kind::Number), number_value(double(i)) {}
40 Json(unsigned long long i) : kind(Kind::Number), number_value(double(i)) {}
41 Json(double d) : kind(Kind::Number), number_value(d) {}
42 Json(float d) : kind(Kind::Number), number_value(double(d)) {}
43 Json(const char* s) : kind(Kind::String), string_value(s) {}
44 Json(const std::string& s) : kind(Kind::String), string_value(s) {}
45
46 static Json make_object();
47 static Json make_array();
48
49 bool is_null() const { return kind == Kind::Null; }
50 bool is_bool() const { return kind == Kind::Bool; }
51 bool is_number() const { return kind == Kind::Number; }
52 bool is_string() const { return kind == Kind::String; }
53 bool is_array() const { return kind == Kind::Array; }
54 bool is_object() const { return kind == Kind::Object; }
55 bool has(const std::string& key) const;
56 const Json* find(const std::string& key) const;
57 const Json* first_child(const std::string& key) const { return find(key); }
58 const Json& at(const std::string& key) const;
59 Json& operator[](const std::string& key);
60 Json& set(const std::string& key, Json value);
61 void push_back(Json value);
62 std::string as_string() const;
63 long as_long() const;
64 double as_double() const;
65 bool as_bool() const;
66 static Json parse(const std::string& text);
67 std::string dump(int indent = 2) const;
68};
69
71{
72public:
74
75 void load(const std::filesystem::path& path);
76 void save(const std::filesystem::path& path, int indent = 2) const;
77 const Json* first_child(const std::string& name) const;
78 const Json* first_child() const { return &root; }
79 static JsonDocument wrap(const std::string& tag, Json value);
80};
81
82// Incremental writer (mirrors the old XmlPrinter API). Only one root object.
84{
85public:
86 void open_element(const std::string& name);
88
89 void begin_array(const std::string& name);
90 void end_array();
93 void add_field(const std::string& name, const std::string& value);
94
95 std::string c_str(int indent = 2) const;
96
97private:
98 Json root;
99 std::vector<Json*> stack; // path of containers currently open
100 std::vector<std::string> name_stack; // for opened named scalar/object
101};
103 const std::string& name,
104 const std::string& value);
105
107 std::initializer_list<std::pair<const char*, std::string>> props);
108float read_json_type (const Json* root, const std::string& field);
109long read_json_index (const Json* root, const std::string& field);
110bool read_json_bool (const Json* root, const std::string& field);
111std::string read_json_string (const Json* root, const std::string& field);
112
113std::string read_json_string_fallback(const Json* root,
114 std::initializer_list<std::string> names);
115
116const Json* require_json_field(const Json* root, const std::string& field);
117
118template<typename Func>
119void for_json_items(const Json* parent, const char* tag, long count, Func func)
120{
121 if (!parent || !parent->is_object())
122 throw std::runtime_error(std::string("Missing JSON parent for: ") + tag);
123
124 const Json* arr = parent->find(tag);
125 if (!arr || !arr->is_array() || long(arr->array_value.size()) != count)
126 throw std::runtime_error(std::string("Missing or wrong-size JSON array: ") + tag);
127
128 for (long i = 0; i < count; i++)
129 func(i, &arr->array_value[size_t(i)]);
130}
131
132JsonDocument load_json_file(const std::filesystem::path& file_name);
133const Json* get_json_root (const JsonDocument& document, const std::string& tag);
134
135}
Definition json.h:71
static JsonDocument wrap(const std::string &tag, Json value)
const Json * first_child(const std::string &name) const
void load(const std::filesystem::path &path)
void save(const std::filesystem::path &path, int indent=2) const
Json root
Definition json.h:73
const Json * first_child() const
Definition json.h:78
Definition json.h:84
void begin_array(const std::string &name)
void add_field(const std::string &name, const std::string &value)
void open_element(const std::string &name)
std::string c_str(int indent=2) const
Definition json.h:22
Json(const std::string &s)
Definition json.h:44
Json(const char *s)
Definition json.h:43
const Json * find(const std::string &key) const
Kind kind
Definition json.h:26
const Json & at(const std::string &key) const
bool is_number() const
Definition json.h:51
static Json make_array()
Json(float d)
Definition json.h:42
Json(bool b)
Definition json.h:34
bool is_array() const
Definition json.h:53
std::string dump(int indent=2) const
Json(long long i)
Definition json.h:37
std::vector< Json > array_value
Definition json.h:30
const Json * first_child(const std::string &key) const
Definition json.h:57
bool is_object() const
Definition json.h:54
Json(long i)
Definition json.h:36
bool bool_value
Definition json.h:27
bool has(const std::string &key) const
long as_long() const
double as_double() const
Json(double d)
Definition json.h:41
Json(unsigned int i)
Definition json.h:38
bool as_bool() const
Json(int i)
Definition json.h:35
std::vector< std::pair< std::string, Json > > object_value
Definition json.h:31
static Json make_object()
double number_value
Definition json.h:28
Json & set(const std::string &key, Json value)
void push_back(Json value)
bool is_bool() const
Definition json.h:50
Json & operator[](const std::string &key)
bool is_string() const
Definition json.h:52
bool is_null() const
Definition json.h:49
std::string as_string() const
Kind
Definition json.h:24
@ String
Definition json.h:24
@ Array
Definition json.h:24
@ Object
Definition json.h:24
@ Number
Definition json.h:24
@ Null
Definition json.h:24
@ Bool
Definition json.h:24
static Json parse(const std::string &text)
Json(unsigned long i)
Definition json.h:39
std::string string_value
Definition json.h:29
Json()=default
Json(unsigned long long i)
Definition json.h:40
Definition adaptive_moment_estimation.h:19
const Json * get_json_root(const JsonDocument &document, const std::string &tag)
long read_json_index(const Json *root, const std::string &field)
JsonDocument load_json_file(const std::filesystem::path &file_name)
float read_json_type(const Json *root, const std::string &field)
void add_json_field(JsonWriter &writer, const std::string &name, const std::string &value)
bool read_json_bool(const Json *root, const std::string &field)
void for_json_items(const Json *parent, const char *tag, long count, Func func)
Definition json.h:119
std::string read_json_string_fallback(const Json *root, std::initializer_list< std::string > names)
std::string read_json_string(const Json *root, const std::string &field)
const Json * require_json_field(const Json *root, const std::string &field)
void write_json(JsonWriter &writer, std::initializer_list< std::pair< const char *, std::string > > props)