C++ header-only library for processing of JSON documents, with focus on small memory footprint and performance.
$ ./build_and_run
#include "fast-json.hpp"
#include <iostream>
#include <string>
using namespace std;
int main(int argc, char** argv){
Arena<1> arena_allocator; // fast-json comes with an arena allocator which supports reallocation,
// the arena API is pretty simple which allows for a straight forward adoption
// of user defined allocators.
fast_json<Arena<1>> jsn;
string json = "[1,2,3,4,5,6]";
auto r {jsn.read(json,&arena_allocator,0)};
if(r){
double sum{};
// fast-json provides a traverse - function which takes a functor f.
// The traversal occurs in document order, i.e. pre-order traversal of the binary representation
// (root node, then children from left to right). If an inner node, i.e. array or object,
// is visited the first time 'enter' is set to true, and false in the case the node is exited, i.e.
// after all children have been visited.
traverse_binary_representation(r->first, r->second.second, [&sum](msg_node*m, bool enter){
if (m->what== msg_node::F64) sum += ((msg_node_f64*)m)->value; // all nodes derive from msg_node,
//dispatch according to the 'what' field, cast if necessary (see fast-json.hpp for details)
});
cout << " sum = " << sum << '\n';
} else {
cerr << "Failed to read JSON.\n";
return 1;
}
{
// Access via the index operator []
std::string json = R"({
"pi":3.141592655359,
"jsonrpc":"2.0",
"id":0,"method":"initialize",
"params":
{
"protocolVersion":"2025-11-25",
"capabilities":{
"sampling":{},
"elicitation":{},
"roots":{"listChanged":true},
"tasks":{
"list":{},
"cancel":{},
"requests":{
"sampling":{"createMessage":{}},
"elicitation":{"create":{}}
}
}
},
"clientInfo":{
"name":"inspector-client",
"version":"0.20.0"
}
}
})";
fast_json<Arena<1>> jsn{json, arena_allocator, 0};
if (!jsn.valid()){
std::cerr << "Failed to read >>"+json+"<<.\n";
return 2;
}
std::string jsonrpc = jsn["jsonrpc"];
std::string method = jsn["method"];
double pi = jsn["pi"];
std::string params_protocolVersion = jsn["params"]["protocolVersion"];
std::cerr << "jsonrpc=" << jsonrpc <<" "<<"method="<< method << " pi=" << pi << " params.protocolVersion=" << params_protocolVersion << "\n";
}
return 0;
}