├── .gitignore ├── json.cpp ├── json.hpp └── logo.png /.gitignore: -------------------------------------------------------------------------------- 1 | *.o 2 | -------------------------------------------------------------------------------- /json.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0xAA55/cppjson/3ab250e6af0428ae844214dd69dc60bdd81ce152/json.cpp -------------------------------------------------------------------------------- /json.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | 11 | namespace JsonLibrary 12 | { 13 | using size_t = std::size_t; 14 | 15 | class JsonDecodeError : public std::runtime_error 16 | { 17 | protected: 18 | size_t LineNo; 19 | size_t Column; 20 | 21 | public: 22 | size_t GetLineNo() const; 23 | size_t GetColumn() const; 24 | JsonDecodeError(size_t FromLineNo, size_t FromColumn, const std::string& what) noexcept; 25 | }; 26 | 27 | class UnicodeEncodeError : public std::runtime_error 28 | { 29 | public: 30 | UnicodeEncodeError(const std::string& what) noexcept; 31 | }; 32 | 33 | class UnicodeDecodeError : public JsonDecodeError 34 | { 35 | protected: 36 | size_t LineNo; 37 | size_t Column; 38 | 39 | public: 40 | size_t GetLineNo() const; 41 | size_t GetColumn() const; 42 | UnicodeDecodeError(size_t FromLineNo, size_t FromColumn, const std::string& what) noexcept; 43 | }; 44 | 45 | class WrongDataType : public std::invalid_argument 46 | { 47 | protected: 48 | size_t LineNo; 49 | size_t Column; 50 | 51 | public: 52 | size_t GetLineNo() const; 53 | size_t GetColumn() const; 54 | WrongDataType(size_t FromLineNo, size_t FromColumn, const std::string& what) noexcept; 55 | }; 56 | 57 | enum class JsonDataType 58 | { 59 | Unknown, 60 | Object, 61 | Array, 62 | String, 63 | Number, 64 | Boolean, 65 | Null 66 | }; 67 | 68 | extern const std::unordered_map JsonDataTypeToStringMap; 69 | std::string JsonDataTypeToString(JsonDataType jd); 70 | 71 | class JsonData; 72 | class JsonObject; 73 | class JsonArray; 74 | class JsonString; 75 | class JsonNumber; 76 | class JsonBoolean; 77 | class JsonNull; 78 | class JsonParser; 79 | 80 | template using JsonPtr = std::shared_ptr; 81 | using JsonDataPtr = JsonPtr; 82 | using JsonObjectPtr = JsonPtr; 83 | using JsonArrayPtr = JsonPtr; 84 | using JsonStringPtr = JsonPtr; 85 | using JsonNumberPtr = JsonPtr; 86 | using JsonBooleanPtr = JsonPtr; 87 | using JsonNullPtr = JsonPtr; 88 | 89 | class JsonData 90 | { 91 | protected: 92 | JsonDataType Type; 93 | size_t LineNo; 94 | size_t Column; 95 | 96 | JsonData(JsonDataType Type, size_t FromLineNo = 0, size_t FromColumn = 0); 97 | 98 | static void AddIndent(std::stringstream& ss, int indent, const std::string& indent_type); 99 | static JsonDataPtr ParseJson(JsonParser& jp); 100 | 101 | public: 102 | JsonData() = delete; 103 | JsonData(const JsonData& c) = default; 104 | 105 | JsonDataType GetType() const; 106 | virtual std::string ToString(int indent = 0, int cur_indent = 0, const std::string& indent_type = " ") const = 0; 107 | virtual JsonDataPtr Copy() const = 0; 108 | 109 | static JsonDataPtr ParseJson(const std::string& s); 110 | 111 | size_t GetLineNo() const; 112 | size_t GetColumn() const; 113 | 114 | JsonObject& AsJsonObject(); 115 | JsonArray& AsJsonArray(); 116 | JsonString& AsJsonString(); 117 | JsonNumber& AsJsonNumber(); 118 | JsonBoolean& AsJsonBoolean(); 119 | 120 | const JsonObject& AsJsonObject() const; 121 | const JsonArray& AsJsonArray() const; 122 | const JsonString& AsJsonString() const; 123 | const JsonNumber& AsJsonNumber() const; 124 | const JsonBoolean& AsJsonBoolean() const; 125 | 126 | bool IsNull() const; 127 | 128 | bool operator ==(const JsonData& c) const; 129 | bool operator !=(const JsonData& c) const; 130 | 131 | JsonDataPtr& operator [] (const std::string& Key); 132 | const JsonDataPtr& at(const std::string& Key) const; 133 | 134 | operator JsonString () const; 135 | 136 | virtual JsonDataPtr& operator [] (const JsonString& Key) = 0; 137 | virtual const JsonDataPtr& at(const JsonString& Key) const = 0; 138 | virtual bool contains(const JsonString& Key) const = 0; 139 | virtual JsonDataPtr& operator [] (size_t Index) = 0; 140 | virtual const JsonDataPtr& at(size_t Index) const = 0; 141 | virtual operator double() const = 0; 142 | 143 | inline operator int8_t() const { return int8_t(operator double()); } 144 | inline operator int16_t() const { return int16_t(operator double()); } 145 | inline operator int32_t() const { return int32_t(operator double()); } 146 | inline operator int64_t() const { return int64_t(operator double()); } 147 | inline operator uint8_t() const { return uint8_t(operator double()); } 148 | inline operator uint16_t() const { return uint16_t(operator double()); } 149 | inline operator uint32_t() const { return uint32_t(operator double()); } 150 | inline operator uint64_t() const { return uint64_t(operator double()); } 151 | }; 152 | 153 | using JsonObjectParentType = std::map; 154 | using JsonArrayParentType = std::vector; 155 | 156 | class JsonObject : public JsonData, public JsonObjectParentType 157 | { 158 | public: 159 | JsonObject(size_t FromLineNo = 0, size_t FromColumn = 0); 160 | JsonObject(const JsonObjectParentType& c, size_t FromLineNo, size_t FromColumn); 161 | JsonObject(const JsonObject& c) = default; 162 | 163 | virtual std::string ToString(int indent = 0, int cur_indent = 0, const std::string& indent_type = " ") const override; 164 | virtual JsonDataPtr Copy() const override; 165 | 166 | bool operator ==(const JsonObject& c) const; 167 | bool operator !=(const JsonObject& c) const; 168 | 169 | template bool contains(T Key) const; 170 | template const JsonDataPtr& at(T Key) const; 171 | template JsonDataPtr& operator [] (T Key); 172 | 173 | virtual JsonDataPtr& operator [] (const JsonString& Key) override; 174 | virtual const JsonDataPtr& at(const JsonString& Key) const override; 175 | virtual bool contains(const JsonString& Key) const override; 176 | virtual JsonDataPtr& operator [] (size_t Index) override; 177 | virtual const JsonDataPtr& at(size_t Index) const override; 178 | virtual operator double() const override; 179 | }; 180 | 181 | extern template JsonDataPtr& JsonObject::operator [] (const std::string& Key); 182 | extern template bool JsonObject::contains(const std::string& Key) const; 183 | extern template const JsonDataPtr& JsonObject::at(const std::string& Key) const; 184 | 185 | extern template JsonDataPtr& JsonObject::operator [] (const char* Key); 186 | extern template bool JsonObject::contains(const char* Key) const; 187 | extern template const JsonDataPtr& JsonObject::at(const char* Key) const; 188 | 189 | class JsonArray : public JsonData, public JsonArrayParentType 190 | { 191 | public: 192 | JsonArray(size_t FromLineNo = 0, size_t FromColumn = 0); 193 | JsonArray(const JsonArrayParentType& c, size_t FromLineNo, size_t FromColumn); 194 | JsonArray(const JsonArray& c) = default; 195 | 196 | virtual std::string ToString(int indent = 0, int cur_indent = 0, const std::string& indent_type = " ") const override; 197 | virtual JsonDataPtr Copy() const override; 198 | 199 | bool operator ==(const JsonArray& c) const; 200 | bool operator !=(const JsonArray& c) const; 201 | 202 | JsonDataPtr& operator [] (const std::string& Key); 203 | const JsonDataPtr& at(const std::string& Key) const; 204 | 205 | virtual JsonDataPtr& operator [] (const JsonString& Key) override; 206 | virtual const JsonDataPtr& at(const JsonString& Key) const override; 207 | virtual bool contains(const JsonString& Key) const override; 208 | virtual JsonDataPtr& operator [] (size_t Index) override; 209 | virtual const JsonDataPtr& at(size_t Index) const override; 210 | virtual operator double() const override; 211 | }; 212 | 213 | class JsonString : public JsonData, public std::string 214 | { 215 | public: 216 | JsonString(size_t FromLineNo = 0, size_t FromColumn = 0); 217 | JsonString(const std::string& Value, size_t FromLineNo, size_t FromColumn); 218 | JsonString(const JsonString& c) = default; 219 | 220 | virtual std::string ToString(int indent = 0, int cur_indent = 0, const std::string& indent_type = " ") const override; 221 | virtual JsonDataPtr Copy() const override; 222 | 223 | bool operator ==(const JsonString& c) const; 224 | bool operator !=(const JsonString& c) const; 225 | 226 | virtual JsonDataPtr& operator [] (const JsonString& Key) override; 227 | virtual const JsonDataPtr& at(const JsonString& Key) const override; 228 | virtual bool contains(const JsonString& Key) const override; 229 | virtual JsonDataPtr& operator [] (size_t Index) override; 230 | virtual const JsonDataPtr& at(size_t Index) const override; 231 | virtual operator double() const override; 232 | }; 233 | 234 | class JsonNumber : public JsonData 235 | { 236 | public: 237 | double Value; 238 | 239 | JsonNumber(size_t FromLineNo = 0, size_t FromColumn = 0); 240 | JsonNumber(std::int32_t Value, size_t FromLineNo, size_t FromColumn); 241 | JsonNumber(std::int64_t Value, size_t FromLineNo, size_t FromColumn); 242 | JsonNumber(std::uint32_t Value, size_t FromLineNo, size_t FromColumn); 243 | JsonNumber(std::uint64_t Value, size_t FromLineNo, size_t FromColumn); 244 | JsonNumber(float Value, size_t FromLineNo, size_t FromColumn); 245 | JsonNumber(double Value, size_t FromLineNo, size_t FromColumn); 246 | JsonNumber(const JsonNumber& c) = default; 247 | 248 | virtual std::string ToString(int indent = 0, int cur_indent = 0, const std::string& indent_type = " ") const override; 249 | virtual JsonDataPtr Copy() const override; 250 | 251 | bool operator ==(const JsonNumber& c) const; 252 | bool operator !=(const JsonNumber& c) const; 253 | 254 | virtual JsonDataPtr& operator [] (const JsonString& Key) override; 255 | virtual const JsonDataPtr& at(const JsonString& Key) const override; 256 | virtual bool contains(const JsonString& Key) const override; 257 | virtual JsonDataPtr& operator [] (size_t Index) override; 258 | virtual const JsonDataPtr& at(size_t Index) const override; 259 | virtual operator double() const override; 260 | }; 261 | 262 | class JsonBoolean : public JsonData 263 | { 264 | public: 265 | bool Value; 266 | 267 | JsonBoolean(size_t FromLineNo = 0, size_t FromColumn = 0); 268 | JsonBoolean(bool Value, size_t FromLineNo, size_t FromColumn); 269 | JsonBoolean(const JsonBoolean& c) = default; 270 | 271 | operator bool() const { return Value; } 272 | virtual std::string ToString(int indent = 0, int cur_indent = 0, const std::string& indent_type = " ") const override; 273 | virtual JsonDataPtr Copy() const override; 274 | 275 | bool operator ==(const JsonBoolean& c) const; 276 | bool operator !=(const JsonBoolean& c) const; 277 | 278 | virtual JsonDataPtr& operator [] (const JsonString& Key) override; 279 | virtual const JsonDataPtr& at(const JsonString& Key) const override; 280 | virtual bool contains(const JsonString& Key) const override; 281 | virtual JsonDataPtr& operator [] (size_t Index) override; 282 | virtual const JsonDataPtr& at(size_t Index) const override; 283 | virtual operator double() const override; 284 | }; 285 | 286 | class JsonNull : public JsonData 287 | { 288 | public: 289 | JsonNull(size_t FromLineNo = 0, size_t FromColumn = 0); 290 | JsonNull(const JsonNull& c) = default; 291 | 292 | virtual std::string ToString(int indent = 0, int cur_indent = 0, const std::string& indent_type = " ") const override; 293 | virtual JsonDataPtr Copy() const override; 294 | 295 | bool operator ==(const JsonNull& c) const; 296 | bool operator !=(const JsonNull& c) const; 297 | 298 | virtual JsonDataPtr& operator [] (const JsonString& Key) override; 299 | virtual const JsonDataPtr& at(const JsonString& Key) const override; 300 | virtual bool contains(const JsonString& Key) const override; 301 | virtual JsonDataPtr& operator [] (size_t Index) override; 302 | virtual const JsonDataPtr& at(size_t Index) const override; 303 | virtual operator double() const override; 304 | }; 305 | 306 | 307 | template 308 | JsonPtr MakeJsonPtr(Args && ... args) 309 | { return std::make_shared(args...); } 310 | 311 | template 312 | JsonPtr MakeJsonDataPtr(Args && ... args) 313 | { return MakeJsonPtr(args...); } 314 | 315 | template 316 | JsonPtr MakeJsonObjectPtr(Args && ... args) 317 | { return MakeJsonPtr(args...); } 318 | 319 | template 320 | JsonPtr MakeJsonArrayPtr(Args && ... args) 321 | { return MakeJsonPtr(args...); } 322 | 323 | template 324 | JsonPtr MakeJsonStringPtr(Args && ... args) 325 | { return MakeJsonPtr(args...); } 326 | 327 | template 328 | JsonPtr MakeJsonNumberPtr(Args && ... args) 329 | { return MakeJsonPtr(args...); } 330 | 331 | template 332 | JsonPtr MakeJsonBooleanPtr(Args && ... args) 333 | { return MakeJsonPtr(args...); } 334 | 335 | template 336 | JsonPtr MakeJsonNullPtr(Args && ... args) 337 | { return MakeJsonPtr(args...); } 338 | 339 | JsonDataPtr ParseJsonFromString(const std::string& s); 340 | JsonDataPtr ParseJsonFromFile(const std::string& FilePath); 341 | 342 | JsonDataPtr Copy(JsonDataPtr Json); 343 | JsonDataPtr Copy(const JsonData& Json); 344 | } 345 | 346 | 347 | -------------------------------------------------------------------------------- /logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0xAA55/cppjson/3ab250e6af0428ae844214dd69dc60bdd81ce152/logo.png --------------------------------------------------------------------------------