annotate C++/Json.cpp @ 311:ed3cc10761e4

Json: * Split Json class into several classes * Add unit tests * Json is considered usable
author David Demelier <markand@malikania.fr>
date Fri, 13 Feb 2015 13:42:21 +0100
parents 777bc3cb665a
children ea1a73a7d468
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 *
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
4 * Copyright (c) 2013, 2014 David Demelier <markand@malikania.fr>
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
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
19 #include "Json.h"
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
20
311
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
21 /* --------------------------------------------------------
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
22 * JsonValue implementation
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
23 * -------------------------------------------------------- */
244
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
24
311
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
25 JsonValue::JsonValue(const JsonValue &value)
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
26 : m_handle(json_deep_copy(value.m_handle.get()), json_decref)
244
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
27 {
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
28 }
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
29
311
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
30 JsonValue &JsonValue::operator=(const JsonValue &value)
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
31 {
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
32 m_handle = Handle(json_deep_copy(value.m_handle.get()), json_decref);
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
33 }
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
34
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
35 JsonValue::JsonValue(json_t *json)
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
36 : m_handle(json, json_decref)
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
37 {
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
38 }
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
39
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
40 JsonValue::JsonValue()
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
41 : m_handle(json_null(), json_decref)
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
42 {
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
43 }
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
44
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
45 JsonValue::JsonValue(bool value)
244
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
46 : m_handle(json_boolean(value), json_decref)
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
47 {
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
48 }
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
49
311
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
50 JsonValue::JsonValue(int value)
244
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
51 : m_handle(json_integer(value), json_decref)
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
52 {
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
53 }
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
54
311
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
55 JsonValue::JsonValue(double value)
244
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
56 : m_handle(json_real(value), json_decref)
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
57 {
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
58 }
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
59
311
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
60 JsonValue::JsonValue(std::string value)
244
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
61 : m_handle(json_string(value.c_str()), json_decref)
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
62 {
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
63 }
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
64
311
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
65 JsonValue::JsonValue(const char *value)
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
66 : m_handle(json_string(value), json_decref)
244
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
67 {
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
68 }
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
69
311
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
70 JsonType JsonValue::typeOf() const
244
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
71 {
311
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
72 return static_cast<JsonType>(json_typeof(m_handle.get()));
244
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
73 }
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
74
311
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
75 bool JsonValue::isObject() const
244
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
76 {
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
77 return json_is_object(m_handle.get()) != 0;
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
78 }
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
79
311
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
80 bool JsonValue::isArray() const
244
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
81 {
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
82 return json_is_array(m_handle.get()) != 0;
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
83 }
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
84
311
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
85 bool JsonValue::isString() const
244
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
86 {
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
87 return json_is_string(m_handle.get()) != 0;
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
88 }
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
89
311
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
90 bool JsonValue::isReal() const
244
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
91 {
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
92 return json_is_real(m_handle.get()) != 0;
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
93 }
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
94
311
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
95 bool JsonValue::isTrue() const
244
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
96 {
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
97 return json_is_true(m_handle.get()) != 0;
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
98 }
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
99
311
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
100 bool JsonValue::isFalse() const
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
101 {
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
102 return json_is_false(m_handle.get()) != 0;
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
103 }
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
104
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
105 bool JsonValue::isNull() const
244
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
106 {
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
107 return json_is_null(m_handle.get()) != 0;
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
108 }
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
109
311
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
110 bool JsonValue::isNumber() const
244
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
111 {
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
112 return json_is_number(m_handle.get()) != 0;
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
113 }
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
114
311
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
115 bool JsonValue::isInteger() const
244
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
116 {
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
117 return json_is_integer(m_handle.get()) != 0;
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
118 }
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
119
311
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
120 bool JsonValue::isBoolean() const
244
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
121 {
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
122 return json_is_boolean(m_handle.get()) != 0;
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
123 }
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
124
311
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
125 std::string JsonValue::toString() const
244
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
126 {
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
127 auto value = json_string_value(m_handle.get());
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
128
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
129 return (value == nullptr) ? "" : value;
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
130 }
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
131
311
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
132 int JsonValue::toInteger() const noexcept
244
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
133 {
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
134 return json_integer_value(m_handle.get());
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
135 }
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
136
311
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
137 double JsonValue::toReal() const noexcept
244
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
138 {
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
139 return json_real_value(m_handle.get());
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
140 }
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
141
311
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
142 JsonObject JsonValue::toObject() const
244
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
143 {
311
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
144 json_incref(m_handle.get());
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
145
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
146 return JsonObject(m_handle.get());
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
147 }
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
148
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
149 JsonArray JsonValue::toArray() const
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
150 {
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
151 json_incref(m_handle.get());
244
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
152
311
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
153 return JsonArray(m_handle.get());
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
154 }
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
155
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
156 /* --------------------------------------------------------
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
157 * JsonArray
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
158 * -------------------------------------------------------- */
244
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
159
311
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
160 JsonArray::JsonArray()
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
161 : JsonValue(json_array())
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
162 {
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
163 }
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
164
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
165 unsigned JsonArray::size() const noexcept
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
166 {
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
167 return json_array_size(m_handle.get());
244
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
168 }
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
169
311
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
170 void JsonArray::push(const JsonValue &value)
244
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
171 {
311
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
172 json_array_insert(m_handle.get(), 0, value.m_handle.get());
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
173 }
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
174
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
175 void JsonArray::append(const JsonValue &value)
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
176 {
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
177 json_array_append(m_handle.get(), value.m_handle.get());
244
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
178 }
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
179
311
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
180 void JsonArray::insert(const JsonValue &value, int index)
244
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
181 {
311
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
182 json_array_insert(m_handle.get(), index, value.m_handle.get());
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
183 }
244
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
184
311
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
185 JsonValue JsonArray::operator[](int index) const
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
186 {
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
187 if (typeOf() != JsonType::Array)
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
188 throw JsonError("not an array");
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
189
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
190 auto value = json_array_get(m_handle.get(), index);
244
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
191
311
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
192 if (value == nullptr)
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
193 throw JsonError("index out of bounds");
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
194
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
195 json_incref(value);
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
196
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
197 return JsonValue(value);
244
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
198 }
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
199
311
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
200 /* --------------------------------------------------------
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
201 * JsonObject
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
202 * -------------------------------------------------------- */
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
203
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
204 JsonObject::JsonObject()
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
205 : JsonValue(json_object())
244
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
206 {
311
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
207 }
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
208
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
209 JsonValue JsonObject::operator[](const std::string &name) const
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
210 {
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
211 if (typeOf() != JsonType::Object)
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
212 throw JsonError("not an object");
244
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
213
311
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
214 auto value = json_object_get(m_handle.get(), name.c_str());
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
215
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
216 if (value == nullptr)
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
217 throw JsonError("key " + name + +" not found");
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
218
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
219 json_incref(value);
244
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
220
311
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
221 return JsonValue(value);
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
222 }
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
223
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
224 void JsonObject::set(const std::string &key, const JsonValue &value)
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
225 {
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
226 json_object_set(m_handle.get(), key.c_str(), value.m_handle.get());
244
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
227 }
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
228
311
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
229 /* --------------------------------------------------------
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
230 * JsonReaderFile
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
231 * -------------------------------------------------------- */
244
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
232
311
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
233 JsonReaderFile::JsonReaderFile(std::string path)
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
234 : m_path(std::move(path))
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
235 {
244
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
236 }
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
237
311
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
238 JsonValue JsonReaderFile::read()
244
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
239 {
311
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
240 json_error_t error;
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
241 json_t *handle = json_load_file(m_path.c_str(), 0, &error);
244
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
242
311
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
243 if (handle == nullptr)
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
244 throw JsonError{error};
244
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
245
311
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
246 return JsonValue(handle);
244
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
247 }
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
248
311
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
249 /* --------------------------------------------------------
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
250 * JsonWriterFile
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
251 * -------------------------------------------------------- */
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
252
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
253 JsonWriterFile::JsonWriterFile(std::string path)
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
254 : m_path(std::move(path))
244
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
255 {
777bc3cb665a Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff changeset
256 }
311
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
257
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
258 void JsonWriterFile::write(const JsonValue &value)
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
259 {
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
260 if (json_dump_file(value, m_path.c_str(), 0) < 0)
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
261 throw JsonError("Failed to write file: " + m_path);
David Demelier <markand@malikania.fr>
parents: 244
diff changeset
262 }