Method: Yajl::Parser#parse
- Defined in:
- ext/yajl/yajl_ext.c
#parse(*args) ⇒ Object
call-seq:
parse(input, buffer_size=8192)
parse(input, buffer_size=8192) { |obj| ... }
input
can either be a string or an IO to parse JSON from
buffer_size
is the size of chunk that will be parsed off the input (if it’s an IO) for each loop of the parsing process. 8192 is a good balance between the different types of streams (off disk, off a socket, etc…), but this option is here so the caller can better tune their parsing depending on the type of stream being passed. A larger read buffer will perform better for files off disk, where as a smaller size may be more efficient for reading off of a socket directly.
If a block was passed, it’s called when an object has been parsed off the stream. This is especially usefull when parsing a stream of multiple JSON objects.
NOTE: you can optionally assign the on_parse_complete
callback, and it will be called the same way the optional block is for this method.
537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 |
# File 'ext/yajl/yajl_ext.c', line 537
static VALUE rb_yajl_parser_parse(int argc, VALUE * argv, VALUE self) {
yajl_status stat;
yajl_parser_wrapper * wrapper;
VALUE rbufsize, input, blk;
unsigned int len;
const char * cptr;
GetParser(self, wrapper);
/* setup our parameters */
rb_scan_args(argc, argv, "11&", &input, &rbufsize, &blk);
if (NIL_P(rbufsize)) {
rbufsize = INT2FIX(READ_BUFSIZE);
} else {
Check_Type(rbufsize, T_FIXNUM);
}
if (!NIL_P(blk)) {
rb_yajl_parser_set_complete_cb(self, blk);
}
if (TYPE(input) == T_STRING) {
cptr = RSTRING_PTR(input);
len = (unsigned int)RSTRING_LEN(input);
yajl_parse_chunk((const unsigned char*)cptr, len, wrapper->parser);
} else if (rb_respond_to(input, intern_io_read)) {
VALUE parsed = rb_str_new(0, FIX2LONG(rbufsize));
while (rb_funcall(input, intern_io_read, 2, rbufsize, parsed) != Qnil) {
cptr = RSTRING_PTR(parsed);
len = (unsigned int)RSTRING_LEN(parsed);
yajl_parse_chunk((const unsigned char*)cptr, len, wrapper->parser);
}
} else {
rb_raise(cParseError, "input must be a string or IO");
}
/* parse any remaining buffered data */
stat = yajl_parse_complete(wrapper->parser);
if (wrapper->parse_complete_callback != Qnil) {
yajl_check_and_fire_callback((void *)self);
return Qnil;
}
return rb_ary_pop(wrapper->builderStack);
}
|