Mercurial > code
annotate C++/modules/Json/Json.cpp @ 403:d5ec1174b707
Massive cleanup
author | David Demelier <markand@malikania.fr> |
---|---|
date | Mon, 05 Oct 2015 14:27:19 +0200 |
parents | 0b576ee64d45 |
children | 9ab878fb9fa2 |
rev | line source |
---|---|
244
777bc3cb665a
Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
1 /* |
777bc3cb665a
Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
2 * Json.cpp -- jansson C++11 wrapper |
777bc3cb665a
Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
3 * |
403 | 4 * Copyright (c) 2013-2015 David Demelier <markand@malikania.fr> |
244
777bc3cb665a
Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
5 * |
777bc3cb665a
Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
6 * Permission to use, copy, modify, and/or distribute this software for any |
777bc3cb665a
Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
7 * purpose with or without fee is hereby granted, provided that the above |
777bc3cb665a
Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
8 * copyright notice and this permission notice appear in all copies. |
777bc3cb665a
Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
9 * |
777bc3cb665a
Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
777bc3cb665a
Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
777bc3cb665a
Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
777bc3cb665a
Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
777bc3cb665a
Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
777bc3cb665a
Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
777bc3cb665a
Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
777bc3cb665a
Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
17 */ |
777bc3cb665a
Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
18 |
314 | 19 #include <stdexcept> |
20 | |
244
777bc3cb665a
Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
21 #include "Json.h" |
777bc3cb665a
Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
22 |
311 | 23 /* -------------------------------------------------------- |
314 | 24 * JsonObject |
311 | 25 * -------------------------------------------------------- */ |
244
777bc3cb665a
Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
26 |
314 | 27 JsonObject JsonValue::toObject() const noexcept |
244
777bc3cb665a
Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
28 { |
311 | 29 json_incref(m_handle.get()); |
30 | |
314 | 31 return JsonObject(m_handle.get()); |
311 | 32 } |
33 | |
314 | 34 JsonArray JsonValue::toArray() const noexcept |
311 | 35 { |
36 json_incref(m_handle.get()); | |
244
777bc3cb665a
Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
37 |
314 | 38 return JsonArray(m_handle.get()); |
311 | 39 } |
40 | |
41 /* -------------------------------------------------------- | |
42 * JsonArray | |
43 * -------------------------------------------------------- */ | |
244
777bc3cb665a
Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
44 |
314 | 45 JsonValue JsonArray::at(int index) const |
244
777bc3cb665a
Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
46 { |
311 | 47 auto value = json_array_get(m_handle.get(), index); |
244
777bc3cb665a
Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
48 |
311 | 49 if (value == nullptr) |
320 | 50 throw JsonError("index out of bounds"); |
311 | 51 |
52 json_incref(value); | |
53 | |
312
ea1a73a7d468
Json: use uniform initializion everywhere
David Demelier <markand@malikania.fr>
parents:
311
diff
changeset
|
54 return JsonValue{value}; |
244
777bc3cb665a
Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
55 } |
777bc3cb665a
Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
56 |
314 | 57 JsonValue JsonArray::operator[](int index) const noexcept |
58 { | |
59 auto value = json_array_get(m_handle.get(), index); | |
60 | |
61 if (value == nullptr) | |
62 return JsonValue(); | |
63 | |
64 json_incref(value); | |
65 | |
66 return JsonValue(value); | |
67 } | |
68 | |
69 JsonArray::Ref JsonArray::operator[](int index) noexcept | |
70 { | |
71 auto value = json_array_get(m_handle.get(), index); | |
72 | |
73 if (value == nullptr) | |
74 value = json_null(); | |
75 else | |
76 json_incref(value); | |
77 | |
78 return Ref(value, *this, index); | |
79 } | |
80 | |
311 | 81 /* -------------------------------------------------------- |
82 * JsonObject | |
83 * -------------------------------------------------------- */ | |
84 | |
314 | 85 JsonObject::Ref JsonObject::operator[](const std::string &name) |
244
777bc3cb665a
Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
86 { |
314 | 87 if (typeOf() != JsonType::Object) |
88 return Ref(JsonValue(), *this, name); | |
89 | |
90 auto value = json_object_get(m_handle.get(), name.c_str()); | |
91 | |
92 json_incref(value); | |
93 | |
94 return Ref(value, *this, name); | |
311 | 95 } |
96 | |
97 JsonValue JsonObject::operator[](const std::string &name) const | |
98 { | |
99 if (typeOf() != JsonType::Object) | |
314 | 100 return JsonValue(); |
244
777bc3cb665a
Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
101 |
311 | 102 auto value = json_object_get(m_handle.get(), name.c_str()); |
103 | |
104 if (value == nullptr) | |
314 | 105 return JsonValue(); |
311 | 106 |
107 json_incref(value); | |
244
777bc3cb665a
Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
108 |
314 | 109 return JsonValue(value); |
244
777bc3cb665a
Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
110 } |
777bc3cb665a
Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
111 |
311 | 112 /* -------------------------------------------------------- |
314 | 113 * JsonDocument |
311 | 114 * -------------------------------------------------------- */ |
244
777bc3cb665a
Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
115 |
314 | 116 JsonValue JsonDocument::read(std::string content, int flags) const |
244
777bc3cb665a
Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
117 { |
311 | 118 json_error_t error; |
314 | 119 json_t *json = json_loads(content.c_str(), flags, &error); |
244
777bc3cb665a
Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
120 |
314 | 121 if (json == nullptr) |
122 throw JsonError(error); | |
244
777bc3cb665a
Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
123 |
314 | 124 return JsonValue(json); |
244
777bc3cb665a
Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
125 } |
777bc3cb665a
Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
126 |
314 | 127 JsonValue JsonDocument::read(std::ifstream &stream, int flags) const |
128 { | |
129 if (!stream.is_open()) | |
130 throw JsonError("File not opened"); | |
311 | 131 |
314 | 132 stream.seekg(0, stream.end); |
133 auto length = stream.tellg(); | |
134 stream.seekg(0, stream.beg); | |
135 | |
136 std::string buffer; | |
137 buffer.resize(length, ' '); | |
138 | |
139 stream.read(&buffer[0], length); | |
140 stream.close(); | |
141 | |
142 return read(std::move(buffer), flags); | |
244
777bc3cb665a
Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
143 } |
311 | 144 |
314 | 145 JsonDocument::JsonDocument(std::ifstream &stream, int flags) |
146 { | |
147 m_value = read(stream, flags); | |
148 } | |
149 | |
150 JsonDocument::JsonDocument(std::ifstream &&stream, int flags) | |
311 | 151 { |
314 | 152 m_value = read(stream, flags); |
311 | 153 } |
314 | 154 |
155 JsonDocument::JsonDocument(std::string content, int flags) | |
156 { | |
157 m_value = read(std::move(content), flags); | |
158 } |