class WebMock::Util::Parsers::JSON

def self.convert_json_to_yaml(json) #:nodoc:

:nodoc:
Ensure that ":" and "," are always followed by a space
def self.convert_json_to_yaml(json) #:nodoc:
  scanner, quoting, marks, times = StringScanner.new(json), false, [], []
  while scanner.scan_until(/(\\['"]|['":,\\]|\\.)/)
    case char = scanner[1]
    when '"', "'"
      if !quoting
        quoting = char
      elsif quoting == char
        quoting = false
      end
    when ":",","
        marks << scanner.pos - 1 unless quoting
    when "\\"
        scanner.skip(/\\/)
    end
  end
  if marks.empty?
    json.gsub(/\\\//, '/')
  else
    left_pos  = [-1].push(*marks)
    right_pos = marks << json.bytesize
    output    = []
    left_pos.each_with_index do |left, i|
      if json.respond_to?(:byteslice)
        output << json.byteslice(left.succ..right_pos[i])
      else
        output << json[left.succ..right_pos[i]]
      end
    end
    output = output * " "
    times.each { |i| output[i-1] = ' ' }
    output.gsub!(/\\\//, '/')
    output
  end
end

def self.parse(json)

def self.parse(json)
  yaml = unescape(convert_json_to_yaml(json))
  YAML.load(yaml)
rescue ArgumentError, Psych::SyntaxError => e
  raise ParseError, "Invalid JSON string: #{yaml}, Error: #{e.inspect}"
end

def self.unescape(str)

def self.unescape(str)
  str.gsub(/\\u([0-9a-f]{4})/) { [$1.hex].pack("U") }
end