The library currently only supports DOM-like parsing. This does not scale when the input files are enormous (#927). I would like to discuss how a SAX-like parser could look like.
My proposal (heavily motivated by RapidJSON) is as follows:
struct SAX
{
// a null value was read
bool null();
// a boolean value was read
bool boolean(bool);
// an integer number was read
bool number_integer(number_integer_t);
// an unsigned integer number was read
bool number_unsigned(number_unsigned_t);
// a floating-point number was read
// the string parameter contains the raw number value
bool number_float(number_float_t, const std::string&);
// a string value was read
bool string(const std::string&);
// the beginning of an object was read
// binary formats may report the number of elements
bool start_object(std::size_t elements);
// an object key was read
bool key(const std::string&);
// the end of an object was read
bool end_object();
// the beginning of an array was read
// binary formats may report the number of elements
bool start_array(std::size_t elements);
// the end of an array was read
bool end_array();
// a binary value was read
// examples are CBOR type 2 strings, MessagePack bin, and maybe UBJSON array<uint8t>
bool binary(const std::vector<uint8_t>& vec);
// a parse error occurred
// the byte position and the last token are reported
bool parse_error(int position, const std::string& last_token);
};
Some remarks:
- All functions return a
bool: true if the parser should continue or false if the parser should stop processing the input.
- The proposal covers parsing of JSON, but also of CBOR, MessagePack, and UBJSON. Therefore, it contains extensions like array or object sizes as well as a binary type which do not occur when parsing JSON.
- The idea is that the user would implement the above struct (we need to discuss whether we make all functions virtual, define a default implementation, etc.) and pass it to new parse functions, e.g.
void parse_json(SAX &sax); or void parse_ubjson(SAX &sax);.
What do you think?
The library currently only supports DOM-like parsing. This does not scale when the input files are enormous (#927). I would like to discuss how a SAX-like parser could look like.
My proposal (heavily motivated by RapidJSON) is as follows:
Some remarks:
bool:trueif the parser should continue orfalseif the parser should stop processing the input.void parse_json(SAX &sax);orvoid parse_ubjson(SAX &sax);.What do you think?