react-native-fast-json 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/FastJson.podspec +41 -0
- package/LICENSE +20 -0
- package/README.md +162 -0
- package/android/CMakeLists.txt +37 -0
- package/android/build.gradle +119 -0
- package/android/src/main/AndroidManifest.xml +2 -0
- package/android/src/main/cpp/cpp-adapter.cpp +11 -0
- package/android/src/main/java/com/margelo/nitro/fastjson/FastJsonPackage.kt +22 -0
- package/cpp/HybridFastJson.cpp +61 -0
- package/cpp/HybridFastJson.hpp +19 -0
- package/cpp/HybridJsonView.cpp +370 -0
- package/cpp/HybridJsonView.hpp +39 -0
- package/cpp/third_party/simdjson.cpp +65338 -0
- package/cpp/third_party/simdjson.h +186793 -0
- package/lib/module/FastJson.nitro.js +4 -0
- package/lib/module/FastJson.nitro.js.map +1 -0
- package/lib/module/index.js +5 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/package.json +1 -0
- package/lib/typescript/package.json +1 -0
- package/lib/typescript/src/FastJson.nitro.d.ts +85 -0
- package/lib/typescript/src/FastJson.nitro.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +4 -0
- package/lib/typescript/src/index.d.ts.map +1 -0
- package/nitro.json +19 -0
- package/nitrogen/generated/android/fastjson+autolinking.cmake +82 -0
- package/nitrogen/generated/android/fastjson+autolinking.gradle +27 -0
- package/nitrogen/generated/android/fastjsonOnLoad.cpp +49 -0
- package/nitrogen/generated/android/fastjsonOnLoad.hpp +34 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/fastjson/fastjsonOnLoad.kt +35 -0
- package/nitrogen/generated/ios/FastJson+autolinking.rb +62 -0
- package/nitrogen/generated/ios/FastJson-Swift-Cxx-Bridge.cpp +17 -0
- package/nitrogen/generated/ios/FastJson-Swift-Cxx-Bridge.hpp +27 -0
- package/nitrogen/generated/ios/FastJson-Swift-Cxx-Umbrella.hpp +38 -0
- package/nitrogen/generated/ios/FastJsonAutolinking.mm +35 -0
- package/nitrogen/generated/ios/FastJsonAutolinking.swift +16 -0
- package/nitrogen/generated/shared/c++/HybridFastJsonSpec.cpp +23 -0
- package/nitrogen/generated/shared/c++/HybridFastJsonSpec.hpp +70 -0
- package/nitrogen/generated/shared/c++/HybridJsonViewSpec.cpp +34 -0
- package/nitrogen/generated/shared/c++/HybridJsonViewSpec.hpp +81 -0
- package/package.json +185 -0
- package/src/FastJson.nitro.ts +86 -0
- package/src/index.tsx +6 -0
|
@@ -0,0 +1,370 @@
|
|
|
1
|
+
#include "HybridJsonView.hpp"
|
|
2
|
+
|
|
3
|
+
#include <NitroModules/AnyMap.hpp>
|
|
4
|
+
#include <NitroModules/ArrayBuffer.hpp>
|
|
5
|
+
|
|
6
|
+
#include <simdjson.h>
|
|
7
|
+
|
|
8
|
+
namespace margelo::nitro::fastjson {
|
|
9
|
+
|
|
10
|
+
using JsonCacheVariants = std::variant<nitro::NullType, bool, double, std::vector<std::string>, std::string, std::shared_ptr<AnyMap>, std::shared_ptr<HybridJsonViewSpec>>;
|
|
11
|
+
|
|
12
|
+
std::unordered_map<std::string, JsonCacheVariants> jsonViews;
|
|
13
|
+
|
|
14
|
+
HybridJsonView::HybridJsonView() : HybridObject(TAG) {
|
|
15
|
+
parser = simdjson::ondemand::parser();
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
std::string getJsonType(simdjson::ondemand::json_type type) {
|
|
19
|
+
switch (type) {
|
|
20
|
+
case simdjson::ondemand::json_type::object: return "object";
|
|
21
|
+
case simdjson::ondemand::json_type::array: return "array";
|
|
22
|
+
case simdjson::ondemand::json_type::string: return "string";
|
|
23
|
+
case simdjson::ondemand::json_type::number: return "number";
|
|
24
|
+
case simdjson::ondemand::json_type::boolean: return "boolean";
|
|
25
|
+
case simdjson::ondemand::json_type::null: return "null";
|
|
26
|
+
default: return "string"; // default to string
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
std::string HybridJsonView::getType() {
|
|
31
|
+
return _type;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
void HybridJsonView::setType(const std::string& type) {
|
|
35
|
+
_type = type;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
double HybridJsonView::getLength() {
|
|
39
|
+
return _length;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
void HybridJsonView::setLength(double length) {
|
|
43
|
+
_length = length;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
std::string HybridJsonView::rawJson() {
|
|
47
|
+
std::string rawJsonKey = std::string(pstr).substr(0, 10) + "_rawJson";
|
|
48
|
+
if (jsonViews.find(rawJsonKey) != jsonViews.end()) {
|
|
49
|
+
return std::get<std::string>(jsonViews[rawJsonKey]);
|
|
50
|
+
}
|
|
51
|
+
doc = parser.iterate(pstr);
|
|
52
|
+
std::string str = std::string(doc.raw_json().value());
|
|
53
|
+
jsonViews[rawJsonKey] = str;
|
|
54
|
+
return str;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
std::variant<nitro::NullType, std::shared_ptr<HybridJsonViewSpec>> HybridJsonView::getValue(const std::string& key) {
|
|
58
|
+
std::string getValueKey = key + "_getValue";
|
|
59
|
+
if (jsonViews.find(getValueKey) != jsonViews.end()) {
|
|
60
|
+
if (std::holds_alternative<std::shared_ptr<HybridJsonViewSpec>>(jsonViews[getValueKey])) {
|
|
61
|
+
return std::get<std::shared_ptr<HybridJsonViewSpec>>(jsonViews[getValueKey]);
|
|
62
|
+
}
|
|
63
|
+
return nitro::null;
|
|
64
|
+
}
|
|
65
|
+
doc = parser.iterate(pstr);
|
|
66
|
+
|
|
67
|
+
auto value = doc[key];
|
|
68
|
+
if (value.error() || value.is_null()) {
|
|
69
|
+
jsonViews[getValueKey] = nitro::null;
|
|
70
|
+
return nitro::null;
|
|
71
|
+
}
|
|
72
|
+
double length = 0;
|
|
73
|
+
std::string type = getJsonType(value.type());
|
|
74
|
+
|
|
75
|
+
if (type == "object") {
|
|
76
|
+
length = value.count_fields();
|
|
77
|
+
}
|
|
78
|
+
if (type == "array") {
|
|
79
|
+
length = value.count_elements();
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
std::shared_ptr<HybridJsonView> view = std::make_shared<HybridJsonView>();
|
|
83
|
+
view->pstr = std::move(value.raw_json().value());
|
|
84
|
+
view->_length = length;
|
|
85
|
+
view->_type = type;
|
|
86
|
+
std::shared_ptr<HybridJsonViewSpec> asSpec = view;
|
|
87
|
+
jsonViews[getValueKey] = asSpec;
|
|
88
|
+
return asSpec;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
std::vector<std::string> HybridJsonView::keys() {
|
|
92
|
+
doc = parser.iterate(pstr);
|
|
93
|
+
if (doc.type() == simdjson::ondemand::json_type::array) {
|
|
94
|
+
std::vector<std::string> keys;
|
|
95
|
+
for (auto key : doc.get_array()) {
|
|
96
|
+
keys.push_back(key.has_value() ? std::string(key.value()) : "");
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
return keys;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
if (doc.type() == simdjson::ondemand::json_type::object) {
|
|
103
|
+
std::vector<std::string> keys;
|
|
104
|
+
for (auto key : doc.get_object()) {
|
|
105
|
+
keys.push_back(key.has_value() ? std::string(key.unescaped_key().value()) : "");
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
return keys;
|
|
109
|
+
}
|
|
110
|
+
return std::vector<std::string>();
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
std::variant<nitro::NullType, std::shared_ptr<HybridJsonViewSpec>> HybridJsonView::at(double index) {
|
|
114
|
+
// get pstr substring first 10 characters
|
|
115
|
+
// this should give us a unique key for the at method
|
|
116
|
+
std::string atKey = std::string(pstr).substr(0, 10) + std::to_string(index) + "_at";
|
|
117
|
+
if (jsonViews.find(atKey) != jsonViews.end()) {
|
|
118
|
+
if (std::holds_alternative<std::shared_ptr<HybridJsonViewSpec>>(jsonViews[atKey])) {
|
|
119
|
+
return std::get<std::shared_ptr<HybridJsonViewSpec>>(jsonViews[atKey]);
|
|
120
|
+
}
|
|
121
|
+
return nitro::null;
|
|
122
|
+
}
|
|
123
|
+
doc = parser.iterate(pstr);
|
|
124
|
+
if (doc.type() == simdjson::ondemand::json_type::array) {
|
|
125
|
+
auto value = doc.at(index);
|
|
126
|
+
if (value.error() || value.is_null()) {
|
|
127
|
+
jsonViews[atKey] = nitro::null;
|
|
128
|
+
return nitro::null;
|
|
129
|
+
}
|
|
130
|
+
std::shared_ptr<HybridJsonView> view = std::make_shared<HybridJsonView>();
|
|
131
|
+
view->_length = value.count_elements();
|
|
132
|
+
view->pstr = std::move(value.raw_json().value());
|
|
133
|
+
view->_type = "array";
|
|
134
|
+
std::shared_ptr<HybridJsonViewSpec> asSpec = view;
|
|
135
|
+
jsonViews[atKey] = asSpec;
|
|
136
|
+
return std::move(asSpec);
|
|
137
|
+
}
|
|
138
|
+
jsonViews[atKey] = nitro::null;
|
|
139
|
+
return nitro::null;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
std::variant<nitro::NullType, std::shared_ptr<HybridJsonViewSpec>> HybridJsonView::atPath(const std::string& path) {
|
|
143
|
+
std::string atPathKey = path + "_atPath";
|
|
144
|
+
if (jsonViews.find(atPathKey) != jsonViews.end()) {
|
|
145
|
+
if (std::holds_alternative<std::shared_ptr<HybridJsonViewSpec>>(jsonViews[atPathKey])) {
|
|
146
|
+
return std::get<std::shared_ptr<HybridJsonViewSpec>>(jsonViews[atPathKey]);
|
|
147
|
+
}
|
|
148
|
+
return nitro::null;
|
|
149
|
+
}
|
|
150
|
+
doc = parser.iterate(pstr);
|
|
151
|
+
auto value = doc.at_path(path);
|
|
152
|
+
if (value.error() || value.is_null()) {
|
|
153
|
+
jsonViews[atPathKey] = nitro::null;
|
|
154
|
+
return nitro::null;
|
|
155
|
+
}
|
|
156
|
+
std::shared_ptr<HybridJsonView> view = std::make_shared<HybridJsonView>();
|
|
157
|
+
std::string type = getJsonType(value.type());
|
|
158
|
+
view->_length = 0;
|
|
159
|
+
if (type == "object") {
|
|
160
|
+
view->_length = value.count_fields();
|
|
161
|
+
}
|
|
162
|
+
if (type == "array") {
|
|
163
|
+
view->_length = value.count_elements();
|
|
164
|
+
}
|
|
165
|
+
view->_type = type;
|
|
166
|
+
view->pstr = std::move(value.raw_json().value());
|
|
167
|
+
std::shared_ptr<HybridJsonViewSpec> asSpec = view;
|
|
168
|
+
jsonViews[atPathKey] = asSpec;
|
|
169
|
+
return asSpec;
|
|
170
|
+
};
|
|
171
|
+
|
|
172
|
+
std::variant<nitro::NullType, std::vector<std::string>> HybridJsonView::atPathWithWildcard(const std::string& path) {
|
|
173
|
+
std::string atPathWithWildcardKey = path + "_atPathWithWildcard";
|
|
174
|
+
if (jsonViews.find(atPathWithWildcardKey) != jsonViews.end()) {
|
|
175
|
+
if (std::holds_alternative<std::vector<std::string>>(jsonViews[atPathWithWildcardKey])) {
|
|
176
|
+
return std::get<std::vector<std::string>>(jsonViews[atPathWithWildcardKey]);
|
|
177
|
+
}
|
|
178
|
+
return nitro::null;
|
|
179
|
+
}
|
|
180
|
+
auto dom = simdjson::dom::parser();
|
|
181
|
+
auto doc = dom.parse(pstr);
|
|
182
|
+
auto value = doc.at_path_with_wildcard(path);
|
|
183
|
+
if (value.error() || !value.has_value()) {
|
|
184
|
+
jsonViews[atPathWithWildcardKey] = nitro::null;
|
|
185
|
+
return nitro::null;
|
|
186
|
+
}
|
|
187
|
+
std::unordered_map<std::string, std::string> objectData;
|
|
188
|
+
std::vector<std::string> arrayData;
|
|
189
|
+
for (const auto& key : value.value()) {
|
|
190
|
+
auto typex = key.type();
|
|
191
|
+
switch (key.type()) {
|
|
192
|
+
case simdjson::dom::element_type::OBJECT:
|
|
193
|
+
arrayData.push_back(simdjson::to_string(key.get_object().value()));
|
|
194
|
+
|
|
195
|
+
break;
|
|
196
|
+
case simdjson::dom::element_type::ARRAY:
|
|
197
|
+
for (const auto& obj : key.get_array()) {
|
|
198
|
+
arrayData.push_back(simdjson::to_string(obj));
|
|
199
|
+
}
|
|
200
|
+
break;
|
|
201
|
+
case simdjson::dom::element_type::STRING:
|
|
202
|
+
arrayData.push_back(simdjson::to_string(key));
|
|
203
|
+
break;
|
|
204
|
+
case simdjson::dom::element_type::INT64:
|
|
205
|
+
arrayData.push_back(std::to_string(key.get_int64()));
|
|
206
|
+
break;
|
|
207
|
+
case simdjson::dom::element_type::UINT64:
|
|
208
|
+
arrayData.push_back(std::to_string(key.get_uint64()));
|
|
209
|
+
break;
|
|
210
|
+
case simdjson::dom::element_type::DOUBLE:
|
|
211
|
+
arrayData.push_back(std::to_string(key.get_double()));
|
|
212
|
+
break;
|
|
213
|
+
case simdjson::dom::element_type::BOOL:
|
|
214
|
+
arrayData.push_back(std::to_string(key.get_bool()));
|
|
215
|
+
break;
|
|
216
|
+
default:
|
|
217
|
+
break;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
// return std::vector<std::string>(objectData.begin(), objectData.end());
|
|
221
|
+
jsonViews[atPathWithWildcardKey] = arrayData;
|
|
222
|
+
return arrayData;
|
|
223
|
+
};
|
|
224
|
+
|
|
225
|
+
std::string HybridJsonView::asString() {
|
|
226
|
+
// get pstr substring first 10 characters
|
|
227
|
+
// this should give us a unique key for the asString method
|
|
228
|
+
std::string asStringKey = std::string(pstr).substr(0, 10) + "_asString";
|
|
229
|
+
if (jsonViews.find(asStringKey) != jsonViews.end()) {
|
|
230
|
+
if (std::holds_alternative<std::string>(jsonViews[asStringKey])) {
|
|
231
|
+
return std::get<std::string>(jsonViews[asStringKey]);
|
|
232
|
+
}
|
|
233
|
+
return std::string();
|
|
234
|
+
}
|
|
235
|
+
doc = parser.iterate(pstr);
|
|
236
|
+
if (doc.type() == simdjson::ondemand::json_type::string) {
|
|
237
|
+
std::string str = std::string(doc.get_string().value());
|
|
238
|
+
jsonViews[asStringKey] = str;
|
|
239
|
+
return str;
|
|
240
|
+
}
|
|
241
|
+
if (doc.type() == simdjson::ondemand::json_type::number) {
|
|
242
|
+
std::string str = std::to_string(doc.get_double().value());
|
|
243
|
+
jsonViews[asStringKey] = str;
|
|
244
|
+
return str;
|
|
245
|
+
}
|
|
246
|
+
return std::string();
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
double HybridJsonView::asNumber() {
|
|
250
|
+
std::string asNumberKey = std::string(pstr).substr(0, 10) + "_asNumber";
|
|
251
|
+
if (jsonViews.find(asNumberKey) != jsonViews.end()) {
|
|
252
|
+
if (std::holds_alternative<double>(jsonViews[asNumberKey])) {
|
|
253
|
+
return std::get<double>(jsonViews[asNumberKey]);
|
|
254
|
+
}
|
|
255
|
+
return 0;
|
|
256
|
+
}
|
|
257
|
+
doc = parser.iterate(pstr);
|
|
258
|
+
if (doc.type() == simdjson::ondemand::json_type::number) {
|
|
259
|
+
double val = doc.get_double().value();
|
|
260
|
+
jsonViews[asNumberKey] = val;
|
|
261
|
+
return val;
|
|
262
|
+
}
|
|
263
|
+
if (doc.type() == simdjson::ondemand::json_type::string) {
|
|
264
|
+
double val = std::stod(std::string(doc.get_string().value()));
|
|
265
|
+
jsonViews[asNumberKey] = val;
|
|
266
|
+
return val;
|
|
267
|
+
}
|
|
268
|
+
if (doc.type() == simdjson::ondemand::json_type::boolean) {
|
|
269
|
+
double val = doc.get_bool().value() ? 1 : 0;
|
|
270
|
+
jsonViews[asNumberKey] = val;
|
|
271
|
+
return val;
|
|
272
|
+
}
|
|
273
|
+
if (doc.type() == simdjson::ondemand::json_type::null) {
|
|
274
|
+
double val = 0;
|
|
275
|
+
jsonViews[asNumberKey] = val;
|
|
276
|
+
return val;
|
|
277
|
+
}
|
|
278
|
+
return 0;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
bool HybridJsonView::asBoolean() {
|
|
282
|
+
doc = parser.iterate(pstr);
|
|
283
|
+
if (doc.type() == simdjson::ondemand::json_type::boolean) {
|
|
284
|
+
return doc.get_bool().value();
|
|
285
|
+
}
|
|
286
|
+
if (doc.type() == simdjson::ondemand::json_type::string) {
|
|
287
|
+
return std::stoi(std::string(doc.get_string().value())) != 0;
|
|
288
|
+
}
|
|
289
|
+
if (doc.type() == simdjson::ondemand::json_type::number) {
|
|
290
|
+
return doc.get_number().value().get_uint64() != 0ull;
|
|
291
|
+
}
|
|
292
|
+
return false;
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
|
|
296
|
+
AnyValue materializeValue(simdjson::ondemand::value& value) {
|
|
297
|
+
std::unordered_map<std::string, AnyValue> objectData;
|
|
298
|
+
std::string str;
|
|
299
|
+
std::vector<AnyValue> arrayData;
|
|
300
|
+
switch (value.type()) {
|
|
301
|
+
case simdjson::ondemand::json_type::object:
|
|
302
|
+
for (auto it : value.get_object()) {
|
|
303
|
+
std::string key = std::string(it.unescaped_key().value());
|
|
304
|
+
auto value = it.value().value();
|
|
305
|
+
AnyValue result = materializeValue(value);
|
|
306
|
+
objectData[key] = result;
|
|
307
|
+
}
|
|
308
|
+
return AnyValue(objectData);
|
|
309
|
+
case simdjson::ondemand::json_type::array:
|
|
310
|
+
for (auto it : value.get_array()) {
|
|
311
|
+
AnyValue result = materializeValue(it.value());
|
|
312
|
+
arrayData.push_back(result);
|
|
313
|
+
}
|
|
314
|
+
return AnyValue(arrayData);
|
|
315
|
+
case simdjson::ondemand::json_type::string:
|
|
316
|
+
str = std::string(value.get_string().value());
|
|
317
|
+
return AnyValue(str);
|
|
318
|
+
case simdjson::ondemand::json_type::number:
|
|
319
|
+
return AnyValue(value.get_double().value());
|
|
320
|
+
case simdjson::ondemand::json_type::boolean:
|
|
321
|
+
return AnyValue(value.get_bool().value());
|
|
322
|
+
case simdjson::ondemand::json_type::null:
|
|
323
|
+
return AnyValue(nitro::null);
|
|
324
|
+
default:
|
|
325
|
+
return AnyValue(nitro::null);
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
std::shared_ptr<AnyMap> HybridJsonView::asObject() {
|
|
330
|
+
std::string asObjectKey = std::string(pstr).substr(0, 10) + "_asObject";
|
|
331
|
+
if (jsonViews.find(asObjectKey) != jsonViews.end()) {
|
|
332
|
+
if (std::holds_alternative<std::shared_ptr<AnyMap>>(jsonViews[asObjectKey])) {
|
|
333
|
+
return std::get<std::shared_ptr<AnyMap>>(jsonViews[asObjectKey]);
|
|
334
|
+
}
|
|
335
|
+
return AnyMap::make();
|
|
336
|
+
}
|
|
337
|
+
doc = parser.iterate(pstr);
|
|
338
|
+
auto map = AnyMap::make();
|
|
339
|
+
if (doc.type() == simdjson::ondemand::json_type::object) {
|
|
340
|
+
std::unordered_map<std::string, AnyValue> objectData;
|
|
341
|
+
auto value = doc.get_object();
|
|
342
|
+
if (value.error() || value.is_empty()) {
|
|
343
|
+
jsonViews[asObjectKey] = nitro::null;
|
|
344
|
+
return map;
|
|
345
|
+
}
|
|
346
|
+
for (auto it : value) {
|
|
347
|
+
auto key = it.unescaped_key().value();
|
|
348
|
+
auto value = it.value().value();
|
|
349
|
+
AnyValue result = materializeValue(value);
|
|
350
|
+
objectData[std::string(key)] = result;
|
|
351
|
+
}
|
|
352
|
+
map->setObject("data", objectData);
|
|
353
|
+
jsonViews[asObjectKey] = map;
|
|
354
|
+
return map;
|
|
355
|
+
}
|
|
356
|
+
if (doc.type() == simdjson::ondemand::json_type::array) {
|
|
357
|
+
std::vector<AnyValue> arrayData;
|
|
358
|
+
for (auto it : doc.get_array()) {
|
|
359
|
+
AnyValue result = materializeValue(it.value());
|
|
360
|
+
arrayData.push_back(result);
|
|
361
|
+
}
|
|
362
|
+
map->setArray("data", arrayData);
|
|
363
|
+
jsonViews[asObjectKey] = map;
|
|
364
|
+
return map;
|
|
365
|
+
}
|
|
366
|
+
jsonViews[asObjectKey] = map;
|
|
367
|
+
return map;
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
} // namespace margelo::nitro::fastjson
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include "HybridJsonViewSpec.hpp"
|
|
4
|
+
#include <simdjson.h>
|
|
5
|
+
|
|
6
|
+
namespace margelo::nitro::fastjson {
|
|
7
|
+
|
|
8
|
+
class HybridJsonView : public HybridJsonViewSpec {
|
|
9
|
+
public:
|
|
10
|
+
HybridJsonView();
|
|
11
|
+
HybridJsonView(const simdjson::ondemand::object& object);
|
|
12
|
+
|
|
13
|
+
std::string getType() override;
|
|
14
|
+
void setType(const std::string& type) override;
|
|
15
|
+
double getLength() override;
|
|
16
|
+
void setLength(double length) override;
|
|
17
|
+
|
|
18
|
+
std::string rawJson() override;
|
|
19
|
+
std::variant<nitro::NullType, std::shared_ptr<HybridJsonViewSpec>> getValue(const std::string& key) override;
|
|
20
|
+
std::vector<std::string> keys() override;
|
|
21
|
+
std::variant<nitro::NullType, std::shared_ptr<HybridJsonViewSpec>> at(double index) override;
|
|
22
|
+
std::variant<nitro::NullType, std::shared_ptr<HybridJsonViewSpec>> atPath(const std::string& path) override;
|
|
23
|
+
std::variant<nitro::NullType, std::vector<std::string>> atPathWithWildcard(const std::string& path) override;
|
|
24
|
+
std::string asString() override;
|
|
25
|
+
double asNumber() override;
|
|
26
|
+
bool asBoolean() override;
|
|
27
|
+
std::shared_ptr<AnyMap> asObject() override;
|
|
28
|
+
|
|
29
|
+
simdjson::padded_string pstr;
|
|
30
|
+
simdjson::ondemand::parser parser;
|
|
31
|
+
simdjson::ondemand::document doc;
|
|
32
|
+
simdjson::ondemand::object obj;
|
|
33
|
+
|
|
34
|
+
private:
|
|
35
|
+
std::string _type;
|
|
36
|
+
double _length = 0;
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
} // namespace margelo::nitro::fastjson
|