Mercurial > code
annotate C++/modules/Json/Json.cpp @ 475:b681299e6987
Json: removal of json::Object, json::Array, json::Document
author | David Demelier <markand@malikania.fr> |
---|---|
date | Mon, 09 Nov 2015 16:52:38 +0100 |
parents | 902b034df6e3 |
children | c7825b8c6145 |
rev | line source |
---|---|
244
777bc3cb665a
Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
1 /* |
405 | 2 * Json.cpp -- C++14 JSON manipulation using jansson parser |
244
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 |
405 | 19 #include "Json.h" |
314 | 20 |
405 | 21 #include <jansson.h> |
244
777bc3cb665a
Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
22 |
404
9ab878fb9fa2
Json: bring classes into json namespace
David Demelier <markand@malikania.fr>
parents:
403
diff
changeset
|
23 namespace json { |
9ab878fb9fa2
Json: bring classes into json namespace
David Demelier <markand@malikania.fr>
parents:
403
diff
changeset
|
24 |
405 | 25 namespace { |
26 | |
27 void readObject(Value &parent, json_t *object); | |
28 void readArray(Value &parent, json_t *array); | |
29 | |
30 Value readValue(json_t *v) | |
31 { | |
32 if (json_is_null(v)) { | |
33 return Value{nullptr}; | |
34 } | |
35 if (json_is_string(v)) { | |
36 return Value{json_string_value(v)}; | |
37 } | |
406 | 38 if (json_is_real(v)) { |
405 | 39 return Value{json_number_value(v)}; |
40 } | |
406 | 41 if (json_is_integer(v)) { |
42 return Value{static_cast<int>(json_integer_value(v))}; | |
43 } | |
405 | 44 if (json_is_boolean(v)) { |
45 return Value{json_boolean_value(v)}; | |
46 } | |
47 if (json_is_object(v)) { | |
475
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
48 Value object{Type::Object}; |
405 | 49 |
50 readObject(object, v); | |
51 | |
52 return object; | |
53 } | |
54 if (json_is_array(v)) { | |
475
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
55 Value array{Type::Array}; |
405 | 56 |
57 readArray(array, v); | |
58 | |
59 return array; | |
60 } | |
61 | |
62 return Value{}; | |
63 } | |
64 | |
65 void readObject(Value &parent, json_t *object) | |
66 { | |
67 const char *key; | |
68 json_t *value; | |
69 | |
70 json_object_foreach(object, key, value) { | |
475
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
71 parent.insert(key, readValue(value)); |
405 | 72 } |
73 } | |
74 | |
75 void readArray(Value &parent, json_t *array) | |
76 { | |
77 size_t index; | |
78 json_t *value; | |
79 | |
80 json_array_foreach(array, index, value) { | |
475
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
81 parent.append(readValue(value)); |
405 | 82 } |
83 } | |
84 | |
85 template <typename Func, typename... Args> | |
86 Value convert(Func fn, Args&&... args) | |
87 { | |
88 json_error_t error; | |
89 json_t *json = fn(std::forward<Args>(args)..., &error); | |
90 | |
91 if (json == nullptr) { | |
92 throw Error{error.text, error.source, error.line, error.column, error.position}; | |
93 } | |
94 | |
95 Value value; | |
96 | |
97 if (json_is_object(json)) { | |
475
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
98 value = Value{Type::Object}; |
405 | 99 readObject(value, json); |
100 } else { | |
475
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
101 value = Value{Type::Array}; |
405 | 102 readArray(value, json); |
103 } | |
104 | |
105 json_decref(json); | |
106 | |
107 return value; | |
108 } | |
109 | |
110 } // !namespace | |
111 | |
475
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
112 void Value::copy(const Value &other) |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
113 { |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
114 switch (other.m_type) { |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
115 case Type::String: |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
116 new (&m_string) std::string(); |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
117 m_string = std::move(other.m_string); |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
118 break; |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
119 case Type::Real: |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
120 m_number = other.m_number; |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
121 break; |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
122 case Type::Int: |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
123 m_integer = other.m_integer; |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
124 break; |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
125 case Type::Boolean: |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
126 m_boolean = other.m_boolean; |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
127 break; |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
128 case Type::Object: |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
129 new (&m_object) std::map<std::string, Value>(); |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
130 m_object = std::move(other.m_object); |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
131 break; |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
132 case Type::Array: |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
133 new (&m_array) std::deque<Value>(); |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
134 m_array = std::move(other.m_array); |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
135 break; |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
136 default: |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
137 break; |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
138 } |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
139 |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
140 m_type = other.m_type; |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
141 } |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
142 |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
143 void Value::move(Value &&other) |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
144 { |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
145 switch (other.m_type) { |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
146 case Type::String: |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
147 new (&m_string) std::string(std::move(other.m_string)); |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
148 break; |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
149 case Type::Real: |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
150 m_number = other.m_number; |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
151 break; |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
152 case Type::Int: |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
153 m_integer = other.m_integer; |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
154 break; |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
155 case Type::Boolean: |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
156 m_boolean = other.m_boolean; |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
157 break; |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
158 case Type::Object: |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
159 new (&m_object) std::map<std::string, Value>(std::move(other.m_object)); |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
160 break; |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
161 case Type::Array: |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
162 new (&m_array) std::deque<Value>(std::move(other.m_array)); |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
163 break; |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
164 default: |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
165 break; |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
166 } |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
167 |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
168 m_type = other.m_type; |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
169 } |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
170 |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
171 Value::Value(Type type) |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
172 : m_type{type} |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
173 { |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
174 switch (type) { |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
175 case Type::String: |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
176 new (&m_string) std::string(); |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
177 break; |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
178 case Type::Array: |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
179 new (&m_array) std::deque<Value>(); |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
180 break; |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
181 case Type::Object: |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
182 new (&m_object) std::map<std::string, Value>(); |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
183 break; |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
184 case Type::Real: |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
185 m_number = 0; |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
186 break; |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
187 case Type::Int: |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
188 m_integer = 0; |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
189 break; |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
190 case Type::Boolean: |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
191 m_boolean = false; |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
192 break; |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
193 default: |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
194 break; |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
195 } |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
196 } |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
197 |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
198 Value::~Value() |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
199 { |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
200 switch (m_type) { |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
201 case Type::String: |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
202 m_string.~basic_string(); |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
203 break; |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
204 case Type::Object: |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
205 m_object.~map<std::string, Value>(); |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
206 break; |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
207 case Type::Array: |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
208 m_array.~deque<Value>(); |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
209 break; |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
210 default: |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
211 break; |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
212 } |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
213 } |
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
214 |
405 | 215 bool Value::toBool() const noexcept |
216 { | |
406 | 217 if (m_type != Type::Boolean) { |
405 | 218 return false; |
406 | 219 } |
405 | 220 |
221 return m_boolean; | |
222 } | |
223 | |
406 | 224 double Value::toReal() const noexcept |
405 | 225 { |
406 | 226 if (m_type != Type::Real) { |
405 | 227 return 0; |
406 | 228 } |
405 | 229 |
230 return m_number; | |
231 } | |
232 | |
406 | 233 int Value::toInt() const noexcept |
234 { | |
235 if (m_type != Type::Int) { | |
236 return 0; | |
237 } | |
238 | |
239 return m_integer; | |
240 } | |
241 | |
405 | 242 std::string Value::toString() const noexcept |
243 { | |
244 if (m_type != Type::String) { | |
245 return ""; | |
246 } | |
247 | |
248 return m_string; | |
249 } | |
244
777bc3cb665a
Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
250 |
475
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
251 Value::Value(const Buffer &buffer) |
244
777bc3cb665a
Add Json, a jansson wrapper
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
252 { |
475
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
253 *this = convert(json_loads, buffer.text.c_str(), 0); |
311 | 254 } |
255 | |
475
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
256 Value::Value(const File &file) |
311 | 257 { |
475
b681299e6987
Json: removal of json::Object, json::Array, json::Document
David Demelier <markand@malikania.fr>
parents:
451
diff
changeset
|
258 *this = convert(json_load_file, file.path.c_str(), 0); |
404
9ab878fb9fa2
Json: bring classes into json namespace
David Demelier <markand@malikania.fr>
parents:
403
diff
changeset
|
259 } |
9ab878fb9fa2
Json: bring classes into json namespace
David Demelier <markand@malikania.fr>
parents:
403
diff
changeset
|
260 |
451
902b034df6e3
Json: escape string construct a new string
David Demelier <markand@malikania.fr>
parents:
445
diff
changeset
|
261 std::string escape(const std::string &value) |
445
f5e62f6c1475
Json: add escape free function
David Demelier <markand@malikania.fr>
parents:
406
diff
changeset
|
262 { |
451
902b034df6e3
Json: escape string construct a new string
David Demelier <markand@malikania.fr>
parents:
445
diff
changeset
|
263 std::string result; |
902b034df6e3
Json: escape string construct a new string
David Demelier <markand@malikania.fr>
parents:
445
diff
changeset
|
264 |
445
f5e62f6c1475
Json: add escape free function
David Demelier <markand@malikania.fr>
parents:
406
diff
changeset
|
265 for (auto it = value.begin(); it != value.end(); ++it) { |
f5e62f6c1475
Json: add escape free function
David Demelier <markand@malikania.fr>
parents:
406
diff
changeset
|
266 switch (*it) { |
f5e62f6c1475
Json: add escape free function
David Demelier <markand@malikania.fr>
parents:
406
diff
changeset
|
267 case '\\': |
451
902b034df6e3
Json: escape string construct a new string
David Demelier <markand@malikania.fr>
parents:
445
diff
changeset
|
268 result += "\\\\"; |
902b034df6e3
Json: escape string construct a new string
David Demelier <markand@malikania.fr>
parents:
445
diff
changeset
|
269 break; |
445
f5e62f6c1475
Json: add escape free function
David Demelier <markand@malikania.fr>
parents:
406
diff
changeset
|
270 case '/': |
451
902b034df6e3
Json: escape string construct a new string
David Demelier <markand@malikania.fr>
parents:
445
diff
changeset
|
271 result += "\\/"; |
902b034df6e3
Json: escape string construct a new string
David Demelier <markand@malikania.fr>
parents:
445
diff
changeset
|
272 break; |
445
f5e62f6c1475
Json: add escape free function
David Demelier <markand@malikania.fr>
parents:
406
diff
changeset
|
273 case '"': |
451
902b034df6e3
Json: escape string construct a new string
David Demelier <markand@malikania.fr>
parents:
445
diff
changeset
|
274 result += "\\\""; |
445
f5e62f6c1475
Json: add escape free function
David Demelier <markand@malikania.fr>
parents:
406
diff
changeset
|
275 break; |
f5e62f6c1475
Json: add escape free function
David Demelier <markand@malikania.fr>
parents:
406
diff
changeset
|
276 case '\b': |
451
902b034df6e3
Json: escape string construct a new string
David Demelier <markand@malikania.fr>
parents:
445
diff
changeset
|
277 result += "\\b"; |
445
f5e62f6c1475
Json: add escape free function
David Demelier <markand@malikania.fr>
parents:
406
diff
changeset
|
278 break; |
f5e62f6c1475
Json: add escape free function
David Demelier <markand@malikania.fr>
parents:
406
diff
changeset
|
279 case '\f': |
451
902b034df6e3
Json: escape string construct a new string
David Demelier <markand@malikania.fr>
parents:
445
diff
changeset
|
280 result += "\\f"; |
445
f5e62f6c1475
Json: add escape free function
David Demelier <markand@malikania.fr>
parents:
406
diff
changeset
|
281 break; |
f5e62f6c1475
Json: add escape free function
David Demelier <markand@malikania.fr>
parents:
406
diff
changeset
|
282 case '\n': |
451
902b034df6e3
Json: escape string construct a new string
David Demelier <markand@malikania.fr>
parents:
445
diff
changeset
|
283 result += "\\n"; |
445
f5e62f6c1475
Json: add escape free function
David Demelier <markand@malikania.fr>
parents:
406
diff
changeset
|
284 break; |
f5e62f6c1475
Json: add escape free function
David Demelier <markand@malikania.fr>
parents:
406
diff
changeset
|
285 case '\r': |
451
902b034df6e3
Json: escape string construct a new string
David Demelier <markand@malikania.fr>
parents:
445
diff
changeset
|
286 result += "\\r"; |
445
f5e62f6c1475
Json: add escape free function
David Demelier <markand@malikania.fr>
parents:
406
diff
changeset
|
287 break; |
f5e62f6c1475
Json: add escape free function
David Demelier <markand@malikania.fr>
parents:
406
diff
changeset
|
288 case '\t': |
451
902b034df6e3
Json: escape string construct a new string
David Demelier <markand@malikania.fr>
parents:
445
diff
changeset
|
289 result += "\\t"; |
445
f5e62f6c1475
Json: add escape free function
David Demelier <markand@malikania.fr>
parents:
406
diff
changeset
|
290 break; |
f5e62f6c1475
Json: add escape free function
David Demelier <markand@malikania.fr>
parents:
406
diff
changeset
|
291 default: |
451
902b034df6e3
Json: escape string construct a new string
David Demelier <markand@malikania.fr>
parents:
445
diff
changeset
|
292 result += *it; |
445
f5e62f6c1475
Json: add escape free function
David Demelier <markand@malikania.fr>
parents:
406
diff
changeset
|
293 break; |
f5e62f6c1475
Json: add escape free function
David Demelier <markand@malikania.fr>
parents:
406
diff
changeset
|
294 } |
f5e62f6c1475
Json: add escape free function
David Demelier <markand@malikania.fr>
parents:
406
diff
changeset
|
295 } |
f5e62f6c1475
Json: add escape free function
David Demelier <markand@malikania.fr>
parents:
406
diff
changeset
|
296 |
451
902b034df6e3
Json: escape string construct a new string
David Demelier <markand@malikania.fr>
parents:
445
diff
changeset
|
297 return result; |
445
f5e62f6c1475
Json: add escape free function
David Demelier <markand@malikania.fr>
parents:
406
diff
changeset
|
298 } |
f5e62f6c1475
Json: add escape free function
David Demelier <markand@malikania.fr>
parents:
406
diff
changeset
|
299 |
406 | 300 } // !json |