2020-02-18 11:59:30 +08:00
|
|
|
#include <iostream>
|
2020-03-03 06:23:19 +08:00
|
|
|
#include "simdjson.h"
|
2020-03-30 07:12:38 +08:00
|
|
|
|
2020-02-18 11:59:30 +08:00
|
|
|
using namespace std;
|
|
|
|
using namespace simdjson;
|
2020-03-30 07:12:38 +08:00
|
|
|
using error_code=simdjson::error_code;
|
2020-02-18 11:59:30 +08:00
|
|
|
|
2020-03-30 07:12:38 +08:00
|
|
|
void basics_1() {
|
|
|
|
const char *filename = "x.txt";
|
2020-02-25 12:59:38 +08:00
|
|
|
|
2020-03-29 02:43:41 +08:00
|
|
|
dom::parser parser;
|
2020-03-30 07:12:38 +08:00
|
|
|
dom::element doc = parser.load(filename); // load and parse a file
|
2020-02-18 11:59:30 +08:00
|
|
|
|
2020-03-30 07:12:38 +08:00
|
|
|
cout << doc;
|
2020-03-09 08:29:15 +08:00
|
|
|
}
|
|
|
|
|
2020-03-30 07:12:38 +08:00
|
|
|
void basics_2() {
|
2020-03-29 02:43:41 +08:00
|
|
|
dom::parser parser;
|
2020-03-30 07:12:38 +08:00
|
|
|
dom::element doc = parser.parse("[1,2,3]"_padded); // parse a string
|
2020-03-05 00:42:29 +08:00
|
|
|
|
2020-03-30 07:12:38 +08:00
|
|
|
cout << doc;
|
2020-03-07 07:40:59 +08:00
|
|
|
}
|
|
|
|
|
2020-03-30 07:12:38 +08:00
|
|
|
void basics_dom_1() {
|
|
|
|
auto cars_json = R"( [
|
|
|
|
{ "make": "Toyota", "model": "Camry", "year": 2018, "tire_pressure": [ 40.1, 39.9, 37.7, 40.4 ] },
|
|
|
|
{ "make": "Kia", "model": "Soul", "year": 2012, "tire_pressure": [ 30.1, 31.0, 28.6, 28.7 ] },
|
|
|
|
{ "make": "Toyota", "model": "Tercel", "year": 1999, "tire_pressure": [ 29.8, 30.0, 30.2, 30.5 ] }
|
|
|
|
] )"_padded;
|
2020-03-29 02:43:41 +08:00
|
|
|
dom::parser parser;
|
2020-03-30 07:12:38 +08:00
|
|
|
dom::array cars = parser.parse(cars_json).get<dom::array>();
|
|
|
|
|
|
|
|
// Iterating through an array of objects
|
|
|
|
for (dom::object car : cars) {
|
|
|
|
// Accessing a field by name
|
|
|
|
cout << "Make/Model: " << car["make"] << "/" << car["model"] << endl;
|
|
|
|
|
|
|
|
// Casting a JSON element to an integer
|
|
|
|
uint64_t year = car["year"];
|
|
|
|
cout << "- This car is " << 2020 - year << "years old." << endl;
|
|
|
|
|
|
|
|
// Iterating through an array of floats
|
|
|
|
double total_tire_pressure = 0;
|
|
|
|
for (double tire_pressure : car["tire_pressure"]) {
|
|
|
|
total_tire_pressure += tire_pressure;
|
|
|
|
}
|
|
|
|
cout << "- Average tire pressure: " << (total_tire_pressure / 4) << endl;
|
|
|
|
|
|
|
|
// Writing out all the information about the car
|
|
|
|
for (auto [key, value] : car) {
|
|
|
|
cout << "- " << key << ": " << value << endl;
|
|
|
|
}
|
|
|
|
}
|
2020-03-15 06:23:56 +08:00
|
|
|
}
|
|
|
|
|
2020-03-30 07:12:38 +08:00
|
|
|
void basics_dom_2() {
|
|
|
|
auto cars_json = R"( [
|
|
|
|
{ "make": "Toyota", "model": "Camry", "year": 2018, "tire_pressure": [ 40.1, 39.9, 37.7, 40.4 ] },
|
|
|
|
{ "make": "Kia", "model": "Soul", "year": 2012, "tire_pressure": [ 30.1, 31.0, 28.6, 28.7 ] },
|
|
|
|
{ "make": "Toyota", "model": "Tercel", "year": 1999, "tire_pressure": [ 29.8, 30.0, 30.2, 30.5 ] }
|
|
|
|
] )"_padded;
|
2020-03-29 02:43:41 +08:00
|
|
|
dom::parser parser;
|
2020-03-30 07:12:38 +08:00
|
|
|
dom::element cars = parser.parse(cars_json);
|
|
|
|
cout << cars.at("0/tire_pressure/1") << endl; // Prints 39.9}
|
2020-03-15 06:23:56 +08:00
|
|
|
}
|
|
|
|
|
2020-03-30 07:12:38 +08:00
|
|
|
void basics_ndjson() {
|
2020-03-29 02:43:41 +08:00
|
|
|
dom::parser parser;
|
2020-03-30 07:12:38 +08:00
|
|
|
for (dom::element doc : parser.load_many("x.txt")) {
|
|
|
|
cout << doc["foo"] << endl;
|
2020-03-15 06:23:56 +08:00
|
|
|
}
|
2020-03-30 07:12:38 +08:00
|
|
|
// Prints 1 2 3
|
2020-03-15 06:23:56 +08:00
|
|
|
}
|
|
|
|
|
2020-03-30 07:15:22 +08:00
|
|
|
void implementation_selection_1() {
|
|
|
|
cout << "simdjson v" << STRINGIFY(SIMDJSON_VERSION) << endl;
|
|
|
|
cout << "Detected the best implementation for your machine: " << simdjson::active_implementation->name();
|
|
|
|
cout << "(" << simdjson::active_implementation->description() << ")" << endl;
|
|
|
|
}
|
|
|
|
|
|
|
|
void implementation_selection_2() {
|
|
|
|
for (auto implementation : simdjson::available_implementations) {
|
|
|
|
cout << implementation->name() << ": " << implementation->description() << endl;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void implementation_selection_3() {
|
|
|
|
cout << simdjson::available_implementations["fallback"]->description() << endl;
|
|
|
|
}
|
|
|
|
|
|
|
|
void implementation_selection_4() {
|
|
|
|
// Use the fallback implementation, even though my machine is fast enough for anything
|
|
|
|
simdjson::active_implementation = simdjson::available_implementations["fallback"];
|
|
|
|
}
|
2020-03-15 06:23:56 +08:00
|
|
|
|
2020-03-30 07:21:19 +08:00
|
|
|
void performance_1() {
|
|
|
|
dom::parser parser;
|
|
|
|
|
|
|
|
// This initializes buffers and a document big enough to handle this JSON.
|
|
|
|
dom::element doc = parser.parse("[ true, false ]"_padded);
|
|
|
|
cout << doc << endl;
|
|
|
|
|
|
|
|
// This reuses the existing buffers, and reuses and *overwrites* the old document
|
|
|
|
doc = parser.parse("[1, 2, 3]"_padded);
|
|
|
|
cout << doc << endl;
|
|
|
|
|
|
|
|
// This also reuses the existing buffers, and reuses and *overwrites* the old document
|
|
|
|
dom::element doc2 = parser.parse("true"_padded);
|
|
|
|
// Even if you keep the old reference around, doc and doc2 refer to the same document.
|
|
|
|
cout << doc << endl;
|
|
|
|
cout << doc2 << endl;
|
|
|
|
}
|
|
|
|
|
|
|
|
// The web_request part of this is aspirational, so we compile as much as we can here
|
|
|
|
void performance_2() {
|
|
|
|
dom::parser parser(1024*1024); // Never grow past documents > 1MB
|
|
|
|
// for (web_request request : listen()) {
|
|
|
|
auto [doc, error] = parser.parse("1"_padded/*request.body*/);
|
|
|
|
// // If the document was above our limit, emit 413 = payload too large
|
|
|
|
if (error == CAPACITY) { /* request.respond(413); continue; */ }
|
|
|
|
// // ...
|
|
|
|
// }
|
|
|
|
}
|
|
|
|
|
|
|
|
// The web_request part of this is aspirational, so we compile as much as we can here
|
|
|
|
void performance_3() {
|
|
|
|
dom::parser parser(0); // This parser will refuse to automatically grow capacity
|
|
|
|
simdjson::error_code allocate_error = parser.set_capacity(1024*1024); // This allocates enough capacity to handle documents <= 1MB
|
|
|
|
if (allocate_error) { cerr << allocate_error << endl; exit(1); }
|
|
|
|
|
|
|
|
// for (web_request request : listen()) {
|
|
|
|
auto [doc, error] = parser.parse("1"_padded/*request.body*/);
|
|
|
|
// If the document was above our limit, emit 413 = payload too large
|
|
|
|
if (error == CAPACITY) { /* request.respond(413); continue; */ }
|
|
|
|
// ...
|
|
|
|
// }
|
|
|
|
}
|
|
|
|
|
2020-02-18 11:59:30 +08:00
|
|
|
int main() {
|
|
|
|
return 0;
|
|
|
|
}
|