This class implements the JSON parser that is used to parse a JSON string into a Ruby data structure.
- N
- P
- Q
- R
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 | = | '' |
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.
Source: show
# 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
Parses the current JSON string source and returns the complete data structure as a result.
Source: show
# 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
Source: show
# File lib/json/pure/parser.rb, line 101 def quirks_mode? !!@quirks_mode end
Source: show
# File lib/json/pure/parser.rb, line 105 def reset super @current_nesting = 0 end