#include "simdjson.h" #include void compute_dump(simdjson::ParsedJson::Iterator &pjh) { if (pjh.is_object()) { std::cout << "{"; if (pjh.down()) { pjh.print(std::cout); // must be a string std::cout << ":"; pjh.next(); compute_dump(pjh); // let us recurse while (pjh.next()) { std::cout << ","; pjh.print(std::cout); std::cout << ":"; pjh.next(); compute_dump(pjh); // let us recurse } pjh.up(); } std::cout << "}"; } else if (pjh.is_array()) { std::cout << "["; if (pjh.down()) { compute_dump(pjh); // let us recurse while (pjh.next()) { std::cout << ","; compute_dump(pjh); // let us recurse } pjh.up(); } std::cout << "]"; } else { pjh.print(std::cout); // just print the lone value } } int main(int argc, char *argv[]) { if (argc < 3) { std::cerr << "Usage: " << argv[0] << " " << std::endl; std::cerr << "Follows the rfc6901 standard's syntax: " "https://tools.ietf.org/html/rfc6901" << std::endl; std::cerr << " Example: " << argv[0] << " jsonexamples/small/demo.json /Image/Width /Image/Height " "/Image/IDs/2 " << std::endl; std::cerr << "Multiple can be issued in the same command, but " "at least one is needed." << std::endl; exit(1); } const char *filename = argv[1]; auto [doc, error] = simdjson::document::load(filename); if (error) { std::cerr << "Error parsing " << filename << ": " << error << std::endl; } std::cout << "[" << std::endl; for (int idx = 2; idx < argc; idx++) { const char *json_pointer = argv[idx]; auto [value, pointer_error] = doc[json_pointer]; std::cout << "{\"jsonpath\": \"" << json_pointer << "\""; if (pointer_error) { std::cout << ",\"error\":\"" << pointer_error << "\""; } else { std::cout << ",\"value\":" << value; } std::cout << "}"; if (idx + 1 < argc) { std::cout << ","; } std::cout << std::endl; } std::cout << "]" << std::endl; return EXIT_SUCCESS; }