8#ifndef INCLUDED_ORCUS_JSON_PARSER_HPP
9#define INCLUDED_ORCUS_JSON_PARSER_HPP
11#include "orcus/json_parser_base.hpp"
57 void object_key(
const char* p,
size_t len,
bool transient)
59 (void)p; (void)len; (void)transient;
93 void string(
const char* p,
size_t len,
bool transient)
95 (void)p; (void)len; (void)transient;
113template<
typename _Handler>
117 typedef _Handler handler_type;
126 json_parser(
const char* p,
size_t n, handler_type& hdl);
143 handler_type& m_handler;
146template<
typename _Handler>
148 const char* p,
size_t n, handler_type& hdl) :
151template<
typename _Handler>
154 m_handler.begin_parse();
160 throw json::parse_error(
"parse: no json content could be found in file", offset());
165 m_handler.end_parse();
168template<
typename _Handler>
182 json::parse_error::throw_with(
183 "root_value: either '[' or '{' was expected, but '", cur_char(),
"' was found.", offset());
187template<
typename _Handler>
188void json_parser<_Handler>::value()
210 m_handler.boolean_true();
214 m_handler.boolean_false();
224 json::parse_error::throw_with(
"value: failed to parse '", cur_char(),
"'.", offset());
228template<
typename _Handler>
229void json_parser<_Handler>::array()
231 assert(cur_char() ==
'[');
233 m_handler.begin_array();
234 for (next(); has_char(); next())
238 if (cur_char() ==
']')
255 if (next_char() ==
']')
257 json::parse_error::throw_with(
258 "array: ']' expected but '", cur_char(),
"' found.", offset() );
262 json::parse_error::throw_with(
263 "array: either ']' or ',' expected, but '", cur_char(),
"' found.", offset());
275 throw json::parse_error(
"array: failed to parse array.", offset());
278template<
typename _Handler>
279void json_parser<_Handler>::end_array()
281 m_handler.end_array();
286template<
typename _Handler>
287void json_parser<_Handler>::object()
289 assert(cur_char() ==
'{');
291 bool require_new_key =
false;
292 m_handler.begin_object();
293 for (next(); has_char(); next())
297 throw json::parse_error(
"object: stream ended prematurely before reaching a key.", offset());
304 json::parse_error::throw_with(
305 "object: new key expected, but '", cur_char(),
"' found.", offset());
307 m_handler.end_object();
314 json::parse_error::throw_with(
315 "object: '\"' was expected, but '", cur_char(),
"' found.", offset());
317 require_new_key =
false;
319 parse_quoted_string_state res = parse_string();
323 if (res.length == parse_quoted_string_state::error_no_closing_quote)
324 throw json::parse_error(
"object: stream ended prematurely before reaching the closing quote of a key.", offset());
325 else if (res.length == parse_quoted_string_state::error_illegal_escape_char)
326 json::parse_error::throw_with(
327 "object: illegal escape character '", cur_char(),
"' in key value.", offset());
329 throw json::parse_error(
"object: unknown error while parsing a key value.", offset());
332 m_handler.object_key(res.str, res.length, res.transient);
335 if (cur_char() !=
':')
336 json::parse_error::throw_with(
337 "object: ':' was expected, but '", cur_char(),
"' found.", offset());
343 throw json::parse_error(
"object: stream ended prematurely before reaching a value.", offset());
349 throw json::parse_error(
"object: stream ended prematurely before reaching either '}' or ','.", offset());
354 m_handler.end_object();
359 require_new_key =
true;
362 json::parse_error::throw_with(
363 "object: either '}' or ',' expected, but '", cur_char(),
"' found.", offset());
367 throw json::parse_error(
"object: closing '}' was never reached.", offset());
370template<
typename _Handler>
371void json_parser<_Handler>::number()
373 assert(is_numeric(cur_char()) || cur_char() ==
'-');
375 double val = parse_double_or_throw();
376 m_handler.number(val);
380template<
typename _Handler>
381void json_parser<_Handler>::string()
383 parse_quoted_string_state res = parse_string();
386 m_handler.string(res.str, res.length, res.transient);
391 if (res.length == parse_quoted_string_state::error_no_closing_quote)
392 throw json::parse_error(
"string: stream ended prematurely before reaching the closing quote.", offset());
393 else if (res.length == parse_quoted_string_state::error_illegal_escape_char)
394 json::parse_error::throw_with(
"string: illegal escape character '", cur_char(),
"'.", offset());
396 throw json::parse_error(
"string: unknown error.", offset());
Definition json_parser_base.hpp:19
Definition json_parser_base.hpp:31
Definition json_parser.hpp:19
void object_key(const char *p, size_t len, bool transient)
Definition json_parser.hpp:57
void null()
Definition json_parser.hpp:80
void boolean_true()
Definition json_parser.hpp:70
void end_parse()
Definition json_parser.hpp:29
void begin_object()
Definition json_parser.hpp:44
void begin_parse()
Definition json_parser.hpp:24
void boolean_false()
Definition json_parser.hpp:75
void end_array()
Definition json_parser.hpp:39
void begin_array()
Definition json_parser.hpp:34
void end_object()
Definition json_parser.hpp:65
void string(const char *p, size_t len, bool transient)
Definition json_parser.hpp:93
void number(double val)
Definition json_parser.hpp:103
Definition json_parser.hpp:115
json_parser(const char *p, size_t n, handler_type &hdl)
Definition json_parser.hpp:147
void parse()
Definition json_parser.hpp:152
Definition parser_base.hpp:41