Class: JSON::Pure::Parser
- Inherits:
-
StringScanner
- Object
- StringScanner
- JSON::Pure::Parser
- Defined in:
- lib/json/pure/parser.rb
Overview
This class implements the JSON parser that is used to parse a JSON string into a Ruby data structure.
Constant Summary collapse
- 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.freeze
Instance Method Summary collapse
-
#initialize(source, opts = {}) ⇒ Parser
constructor
Creates a new JSON::Pure::Parser instance for the string source.
-
#parse ⇒ Object
Parses the current JSON string source and returns the complete data structure as a result.
- #reset ⇒ Object
Constructor Details
#initialize(source, opts = {}) ⇒ Parser
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 100.
-
allow_nan: If set to true, allow NaN, Infinity and -Infinity in defiance of RFC 7159 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. It’s not possible to use this option in conjunction with the create_additions option.
-
create_additions: If set to true, the Parser creates additions when if a matching class and create_id was found. This option defaults to false.
-
object_class: Defaults to Hash
-
array_class: Defaults to Array
73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 |
# File 'lib/json/pure/parser.rb', line 73 def initialize(source, opts = {}) opts ||= {} source = convert_encoding source super source if !opts.key?(:max_nesting) # defaults to 100 @max_nesting = 100 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 = false end @symbolize_names && @create_additions and raise ArgumentError, 'options :symbolize_names and :create_additions cannot be used '\ 'in conjunction' @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 Method Details
#parse ⇒ Object
Parses the current JSON string source and returns the complete data structure as a result.
109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 |
# File 'lib/json/pure/parser.rb', line 109 def parse reset obj = nil while !eos? && skip(IGNORE) do end if eos? raise ParserError, "source is not valid JSON!" else obj = parse_value UNPARSED.equal?(obj) and raise ParserError, "source is not valid JSON!" end while !eos? && skip(IGNORE) do end eos? or raise ParserError, "source is not valid JSON!" obj end |
#reset ⇒ Object
102 103 104 105 |
# File 'lib/json/pure/parser.rb', line 102 def reset super @current_nesting = 0 end |