Class: JSON::Repairer

Inherits:
Object
  • Object
show all
Includes:
JSON::Repair::StringUtils
Defined in:
lib/json/repairer.rb

Constant Summary collapse

CONTROL_CHARACTERS =
{
  "\b" => '\b',
  "\f" => '\f',
  "\n" => '\n',
  "\r" => '\r',
  "\t" => '\t'
}.freeze
ESCAPE_CHARACTERS =
{
  '"' => '"',
  '\\' => '\\',
  '/' => '/',
  'b' => "\b",
  'f' => "\f",
  'n' => "\n",
  'r' => "\r",
  't' => "\t"
}.freeze
MARKDOWN_OPEN_BLOCKS =
['```', '[```', '{```'].freeze
MARKDOWN_CLOSE_BLOCKS =
['```', '```]', '```}'].freeze

Constants included from JSON::Repair::StringUtils

JSON::Repair::StringUtils::ACUTE_ACCENT, JSON::Repair::StringUtils::ASTERISK, JSON::Repair::StringUtils::BACKSLASH, JSON::Repair::StringUtils::BACKSPACE, JSON::Repair::StringUtils::CLOSE_PARENTHESIS, JSON::Repair::StringUtils::CLOSING_BRACE, JSON::Repair::StringUtils::CLOSING_BRACKET, JSON::Repair::StringUtils::COLON, JSON::Repair::StringUtils::COMMA, JSON::Repair::StringUtils::DOT, JSON::Repair::StringUtils::DOUBLE_QUOTE, JSON::Repair::StringUtils::DOUBLE_QUOTE_LEFT, JSON::Repair::StringUtils::DOUBLE_QUOTE_RIGHT, JSON::Repair::StringUtils::EN_QUAD, JSON::Repair::StringUtils::FORM_FEED, JSON::Repair::StringUtils::GRAVE_ACCENT, JSON::Repair::StringUtils::IDEOGRAPHIC_SPACE, JSON::Repair::StringUtils::LOWERCASE_A, JSON::Repair::StringUtils::LOWERCASE_E, JSON::Repair::StringUtils::LOWERCASE_F, JSON::Repair::StringUtils::MEDIUM_MATHEMATICAL_SPACE, JSON::Repair::StringUtils::MINUS, JSON::Repair::StringUtils::MONGOLIAN_VOWEL_SEPARATOR, JSON::Repair::StringUtils::NARROW_NO_BREAK_SPACE, JSON::Repair::StringUtils::NEWLINE, JSON::Repair::StringUtils::NINE, JSON::Repair::StringUtils::NON_BREAKING_SPACE, JSON::Repair::StringUtils::OPENING_BRACE, JSON::Repair::StringUtils::OPENING_BRACKET, JSON::Repair::StringUtils::OPEN_PARENTHESIS, JSON::Repair::StringUtils::PLUS, JSON::Repair::StringUtils::QUOTE, JSON::Repair::StringUtils::QUOTE_LEFT, JSON::Repair::StringUtils::QUOTE_RIGHT, JSON::Repair::StringUtils::REGEX_DELIMITER, JSON::Repair::StringUtils::REGEX_FUNCTION_NAME_CHAR, JSON::Repair::StringUtils::REGEX_FUNCTION_NAME_CHAR_START, JSON::Repair::StringUtils::REGEX_START_OF_VALUE, JSON::Repair::StringUtils::REGEX_UNQUOTED_STRING_DELIMITER, JSON::Repair::StringUtils::REGEX_URL_CHAR, JSON::Repair::StringUtils::REGEX_URL_START, JSON::Repair::StringUtils::RETURN, JSON::Repair::StringUtils::SEMICOLON, JSON::Repair::StringUtils::SLASH, JSON::Repair::StringUtils::SPACE, JSON::Repair::StringUtils::TAB, JSON::Repair::StringUtils::UPPERCASE_A, JSON::Repair::StringUtils::UPPERCASE_E, JSON::Repair::StringUtils::UPPERCASE_F, JSON::Repair::StringUtils::ZERO, JSON::Repair::StringUtils::ZERO_WIDTH_NO_BREAK_SPACE, JSON::Repair::StringUtils::ZERO_WIDTH_SPACE

Instance Method Summary collapse

Methods included from JSON::Repair::StringUtils

#control_character?, #delimiter?, #digit?, #double_quote?, #double_quote_like?, #ends_with_comma_or_newline?, #function_name_char?, #function_name_char_start?, #hex?, #insert_before_last_whitespace, #parse_keyword, #parse_keywords, #quote?, #remove_at_index, #single_quote?, #single_quote_like?, #special_whitespace?, #start_of_value?, #strip_last_occurrence, #unquoted_string_delimiter?, #valid_string_character?, #whitespace?, #whitespace_except_newline?

Constructor Details

#initialize(json) ⇒ Repairer

Returns a new instance of Repairer.



31
32
33
34
35
# File 'lib/json/repairer.rb', line 31

def initialize(json)
  @json = json
  @index = 0
  @output = +''
end

Instance Method Details

#repairObject



37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/json/repairer.rb', line 37

def repair
  parse_markdown_code_block(MARKDOWN_OPEN_BLOCKS)

  processed = parse_value

  throw_unexpected_end unless processed

  parse_markdown_code_block(MARKDOWN_CLOSE_BLOCKS)

  processed_comma = parse_character(COMMA)
  parse_whitespace_and_skip_comments if processed_comma

  if start_of_value?(@json[@index]) && ends_with_comma_or_newline?(@output)
    # start of a new value after end of the root level object: looks like
    # newline delimited JSON -> turn into a root level array
    unless processed_comma
      # repair missing comma
      @output = insert_before_last_whitespace(@output, ',')
    end

    parse_newline_delimited_json
  elsif processed_comma
    # repair: remove trailing comma
    @output = strip_last_occurrence(@output, ',')
  end

  # repair redundant end quotes
  while @json[@index] == CLOSING_BRACE || @json[@index] == CLOSING_BRACKET
    @index += 1
    parse_whitespace_and_skip_comments
  end

  if @index >= @json.length
    # reached the end of the document properly
    return @output
  end

  throw_unexpected_character
end