Class: JsonParser

Inherits:
Object
  • Object
show all
Defined in:
lib/com/microsoft/json-parser.rb

Instance Method Summary collapse

Constructor Details

#initialize(logger, linear_reader) ⇒ JsonParser

Returns a new instance of JsonParser.



16
17
18
19
20
21
22
23
24
# File 'lib/com/microsoft/json-parser.rb', line 16

def initialize(logger, linear_reader)
  @logger = logger
  @linear_reader = linear_reader
  @stream_base_offset = 0

  @stream_reader = StreamReader.new(@logger,@linear_reader)
  @parser_factory = javax::json::Json.createParserFactory(nil)
  @parser = @parser_factory.createParser(@stream_reader)
end

Instance Method Details

#parse(on_json_cbk, on_skip_malformed_cbk) ⇒ Object



26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/com/microsoft/json-parser.rb', line 26

def parse(on_json_cbk, on_skip_malformed_cbk)
  completed = false
  while !completed
    completed, start_index, end_index = parse_single_object(on_json_cbk)
    if !completed

      # if current position in the stream is not a well formed JSON then
      # I can skip all future chars until I find a '{' so I won't have to create the parser for each char
      json_candidate_start_index = @stream_reader.find('{',   end_index)
      json_candidate_start_index = @stream_reader.get_cached_stream_length - 1 if json_candidate_start_index.nil?
      @logger.debug("JsonParser::parse Skipping Malformed JSON (start: #{start_index} end: #{end_index} candidate: #{json_candidate_start_index - 1}).  Resetting the parser") 
      end_index = json_candidate_start_index - 1  

      on_skip_malformed_cbk.call(@stream_reader.get_stream_buffer(start_index, end_index))
      @stream_reader.drop_stream(end_index + 1)
      @stream_reader.reset_cached_stream_index(0)

      @stream_base_offset = 0
      @parser.close()
      if @stream_reader.get_cached_stream_length <= 1
        on_skip_malformed_cbk.call(@stream_reader.get_stream_buffer(0, -1))
        return
      end
      @parser  = @parser_factory.createParser(@stream_reader)
    end
  end
end