This class implements the JSON parser that is used to parse a JSON string into a Ruby data structure.

Methods
N
P
Q
R
Constants
STRING = /" ((?:[^\x0-\x1f"\\] | # escaped special characters: \\["\\\/bfnrt] | \\u[0-9a-fA-F]{4} | # match all but escaped special characters: \\[\x20-\x21\x23-\x2e\x30-\x5b\x5d-\x61\x63-\x65\x67-\x6d\x6f-\x71\x73\x75-\xff])*) "/nx
 
INTEGER = /(-?0|-?[1-9]\d*)/
 
FLOAT = /(-? (?:0|[1-9]\d*) (?: \.\d+(?i:e[+-]?\d+) | \.\d+ | (?i:e[+-]?\d+) ) )/x
 
NAN = /NaN/
 
INFINITY = /Infinity/
 
MINUS_INFINITY = /-Infinity/
 
OBJECT_OPEN = /\{/
 
OBJECT_CLOSE = /\}/
 
ARRAY_OPEN = /\[/
 
ARRAY_CLOSE = /\]/
 
PAIR_DELIMITER = /:/
 
COLLECTION_DELIMITER = /,/
 
TRUE = /true/
 
FALSE = /false/
 
NULL = /null/
 
IGNORE = %r( (?: //[^\n\r]*[\n\r]| # line comments /\* # c-style comments (?: [^*/]| # normal chars /[^*]| # slashes that do not start a nested comment \*[^/]| # asterisks that do not end this comment /(?=\*/) # single slash before this comment's end )* \*/ # the End of this comment |[ \t\r\n]+ # whitespaces: space, horicontal tab, lf, cr )+ )mx
 
UNPARSED = Object.new
 
UNESCAPE_MAP = Hash.new { |h, k| h[k] = k.chr }
 

Unescape characters in strings.

EMPTY_8BIT_STRING = ''
 
Class Public methods
new(source, opts = {})

Creates a new JSON::Pure::Parser instance for the string source.

It will be configured by the opts hash. opts can have the following keys:

  • max_nesting: The maximum depth of nesting allowed in the parsed data structures. Disable depth checking with :max_nesting => false|nil|0, it defaults to 19.

  • allow_nan: If set to true, allow NaN, Infinity and -Infinity in defiance of RFC 4627 to be parsed by the Parser. This option defaults to false.

  • symbolize_names: If set to true, returns symbols for the names (keys) in a JSON object. Otherwise strings are returned, which is also the default.

  • create_additions: If set to false, the Parser doesn't create additions even if a matchin class and create_id was found. This option defaults to true.

  • object_class: Defaults to Hash

  • array_class: Defaults to Array

  • quirks_mode: Enables quirks_mode for parser, that is for example parsing single JSON values instead of documents is possible.

# File lib/json/pure/parser.rb, line 73
def initialize(source, opts = {})
  opts ||= {}
  unless @quirks_mode = opts[:quirks_mode]
    source = convert_encoding source
  end
  super source
  if !opts.key?(:max_nesting) # defaults to 19
    @max_nesting = 19
  elsif opts[:max_nesting]
    @max_nesting = opts[:max_nesting]
  else
    @max_nesting = 0
  end
  @allow_nan = !!opts[:allow_nan]
  @symbolize_names = !!opts[:symbolize_names]
  if opts.key?(:create_additions)
    @create_additions = !!opts[:create_additions]
  else
    @create_additions = true
  end
  @create_id = @create_additions ? JSON.create_id : nil
  @object_class = opts[:object_class] || Hash
  @array_class  = opts[:array_class] || Array
  @match_string = opts[:match_string]
end
Instance Public methods
parse()

Parses the current JSON string source and returns the complete data structure as a result.

# File lib/json/pure/parser.rb, line 112
def parse
  reset
  obj = nil
  if @quirks_mode
    while !eos? && skip(IGNORE)
    end
    if eos?
      raise ParserError, "source did not contain any JSON!"
    else
      obj = parse_value
      obj == UNPARSED and raise ParserError, "source did not contain any JSON!"
    end
  else
    until eos?
      case
      when scan(OBJECT_OPEN)
        obj and raise ParserError, "source '#{peek(20)}' not in JSON!"
        @current_nesting = 1
        obj = parse_object
      when scan(ARRAY_OPEN)
        obj and raise ParserError, "source '#{peek(20)}' not in JSON!"
        @current_nesting = 1
        obj = parse_array
      when skip(IGNORE)
        ;
      else
        raise ParserError, "source '#{peek(20)}' not in JSON!"
      end
    end
    obj or raise ParserError, "source did not contain any JSON!"
  end
  obj
end
quirks_mode?()
# File lib/json/pure/parser.rb, line 101
def quirks_mode?
  !!@quirks_mode
end
reset()
# File lib/json/pure/parser.rb, line 105
def reset
  super
  @current_nesting = 0
end