MSTL 1.4.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
json_value.hpp
1#ifndef MSTL_CORE_FILE_JSON_JSON_VALUE_HPP__
2#define MSTL_CORE_FILE_JSON_JSON_VALUE_HPP__
3#include "MSTL/core/container/unordered_map.hpp"
4#include "MSTL/core/container/vector.hpp"
6#include "MSTL/core/interface/istringify.hpp"
8
9MSTL_ERROR_BUILD_FINAL_CLASS(json_exception, value_exception, "Json String Parse Failed")
10
11
12class json_value;
13class json_null;
14class json_bool;
15class json_number;
16class json_string;
17class json_object;
18class json_array;
19
20
21class MSTL_API json_value : public istringify<json_value> {
22public:
23 enum types {
24 Null,
25 Bool,
26 Number,
27 String,
28 Object,
29 Array
30 };
31
32 virtual ~json_value() = default;
33 MSTL_NODISCARD virtual types type() const noexcept = 0;
34
35 MSTL_NODISCARD virtual const json_null* as_null() const noexcept { return nullptr; }
36 MSTL_NODISCARD virtual const json_bool* as_bool() const noexcept { return nullptr; }
37 MSTL_NODISCARD virtual const json_number* as_number() const noexcept { return nullptr; }
38 MSTL_NODISCARD virtual const json_string* as_string() const noexcept { return nullptr; }
39 MSTL_NODISCARD virtual const json_object* as_object() const noexcept { return nullptr; }
40 MSTL_NODISCARD virtual const json_array* as_array() const noexcept { return nullptr; }
41
42 MSTL_NODISCARD bool is_null() const noexcept { return type() == Null; }
43 MSTL_NODISCARD bool is_bool() const noexcept { return type() == Bool; }
44 MSTL_NODISCARD bool is_number() const noexcept { return type() == Number; }
45 MSTL_NODISCARD bool is_string() const noexcept { return type() == String; }
46 MSTL_NODISCARD bool is_object() const noexcept { return type() == Object; }
47 MSTL_NODISCARD bool is_array() const noexcept { return type() == Array; }
48
49 MSTL_NODISCARD string to_string() const;
50};
51
52using json_ptr = unique_ptr<json_value>;
53
54
55class MSTL_API json_null final : public json_value {
56public:
57 MSTL_NODISCARD types type() const noexcept override { return Null; }
58 MSTL_NODISCARD const json_null* as_null() const noexcept override { return this; }
59};
60
61class MSTL_API json_bool final : public json_value {
62private:
63 bool value;
64
65public:
66 explicit json_bool(const bool v) noexcept : value(v) {}
67 MSTL_NODISCARD types type() const noexcept override { return Bool; }
68 MSTL_NODISCARD const json_bool* as_bool() const noexcept override { return this; }
69 MSTL_NODISCARD bool get_value() const noexcept { return value; }
70};
71
72class MSTL_API json_number final : public json_value {
73private:
74 double value;
75
76public:
77 explicit json_number(const double v) noexcept : value(v) {}
78 MSTL_NODISCARD types type() const noexcept override { return Number; }
79 MSTL_NODISCARD const json_number* as_number() const noexcept override { return this; }
80 MSTL_NODISCARD double get_value() const noexcept { return value; }
81};
82
83class MSTL_API json_string final : public json_value {
84private:
85 string value;
86
87public:
88 explicit json_string(string v) noexcept : value(_MSTL move(v)) {}
89 MSTL_NODISCARD types type() const noexcept override { return String; }
90 MSTL_NODISCARD const json_string* as_string() const noexcept override { return this; }
91 MSTL_NODISCARD const string& get_value() const noexcept { return value; }
92};
93
94class MSTL_API json_object final : public json_value {
95private:
96 unordered_map<string, json_ptr> members{};
97
98public:
99 json_object() = default;
100 json_object(const json_object&) = delete;
101 json_object& operator =(const json_object&) = delete;
102 json_object(json_object&&) = default;
103 json_object& operator =(json_object&&) = default;
104
105 MSTL_NODISCARD types type() const noexcept override { return Object; }
106 MSTL_NODISCARD const json_object* as_object() const noexcept override { return this; }
107
108 void add_member(const string& key, unique_ptr<json_value> value) {
109 members[key] = _MSTL move(value);
110 }
111
112 MSTL_NODISCARD const json_value* get_member(const string& key) const {
113 const auto it = members.find(key);
114 if (it != members.end()) return it->second.get();
115 return nullptr;
116 }
117
118 MSTL_NODISCARD const unordered_map<string, json_ptr>& get_members() const noexcept {
119 return members;
120 }
121};
122
123class MSTL_API json_array final : public json_value {
124private:
125 vector<json_ptr> elements;
126
127public:
128 json_array() = default;
129 json_array(const json_array&) = delete;
130 json_array& operator =(const json_array&) = delete;
131 json_array(json_array&&) = default;
132 json_array& operator =(json_array&&) = default;
133
134 MSTL_NODISCARD types type() const noexcept override { return Array; }
135 MSTL_NODISCARD const json_array* as_array() const noexcept override { return this; }
136
137
138 void add_element(unique_ptr<json_value> value) {
139 elements.emplace_back(_MSTL move(value));
140 }
141
142 MSTL_NODISCARD const json_value* get_element(const size_t index) const noexcept {
143 if (index < elements.size()) return elements[index].get();
144 return nullptr;
145 }
146
147 MSTL_NODISCARD size_t size() const noexcept { return elements.size(); }
148 MSTL_NODISCARD const vector<json_ptr>& get_elements() const noexcept { return elements; }
149};
150
152string MSTL_API json_value_to_string(const json_value* value);
153string MSTL_API json_value_to_indent_string(const json_value* value, int indent);
155
156MSTL_ALWAYS_INLINE_INLINE string to_string(const json_value* value) {
157 return _INNER json_value_to_string(value);
158}
159MSTL_ALWAYS_INLINE_INLINE string to_string(const json_value& value) {
160 return _INNER json_value_to_string(&value);
161}
162MSTL_ALWAYS_INLINE_INLINE string to_string(const json_ptr& value) {
163 return _INNER json_value_to_string(value.get());
164}
165
166MSTL_ALWAYS_INLINE_INLINE string to_indent_string(const json_value* value) {
167 return _INNER json_value_to_indent_string(value, 0);
168}
169MSTL_ALWAYS_INLINE_INLINE string to_indent_string(const json_value& value) {
170 return _INNER json_value_to_indent_string(&value, 0);
171}
172MSTL_ALWAYS_INLINE_INLINE string to_indent_string(const json_ptr& value) {
173 return _INNER json_value_to_indent_string(value.get() ,0);
174}
175
176MSTL_NODISCARD MSTL_ALWAYS_INLINE_INLINE string json_value::to_string() const {
177 return _MSTL to_indent_string(this);
178}
179
181#endif // MSTL_CORE_FILE_JSON_JSON_VALUE_HPP__
独占智能指针
MSTL_CONSTEXPR20 pointer get() const noexcept
获取原始指针
#define MSTL_ERROR_BUILD_FINAL_CLASS(THIS, BASE, INFO)
构建最终异常类宏
#define _MSTL
全局命名空间MSTL前缀
#define MSTL_END_INNER__
结束inner命名空间
#define _INNER
inner命名空间前缀
#define MSTL_END_NAMESPACE__
结束全局命名空间MSTL
#define MSTL_BEGIN_NAMESPACE__
开始全局命名空间MSTL
#define MSTL_BEGIN_INNER__
开始inner命名空间
constexpr Iterator2 move(Iterator1 first, Iterator1 last, Iterator2 result)
移动范围元素
MSTL_NODISCARD MSTL_ALWAYS_INLINE constexpr decltype(auto) size(const Container &cont) noexcept(noexcept(cont.size()))
获取容器的大小
判断类型是否为数组类型
判断类型是否为对象类型
变量处理异常
MSTL独占智能指针