lib/crack/json.rb in crack-0.1.8 vs lib/crack/json.rb in crack-0.2.0
- old
+ new
@@ -14,20 +14,25 @@
raise ParseError, "Invalid JSON string"
end
protected
def self.unescape(str)
- str.gsub(/\\u([0-9a-f]{4})/) { [$1.hex].pack("U") }
+ # Force the encoding to be UTF-8 so we can perform regular expressions
+ # on 1.9.2 without blowing up.
+ # see http://stackoverflow.com/questions/1224204/ruby-mechanize-getting-force-encoding-exception for a similar issue
+ str.force_encoding('UTF-8') if defined?(Encoding) && str.respond_to?(:force_encoding)
+ str.gsub(/\\u0000/, "").gsub(/\\[u|U]([0-9a-fA-F]{4})/) { [$1.hex].pack("U") }
end
-
+
# matches YAML-formatted dates
DATE_REGEX = /^\d{4}-\d{2}-\d{2}$|^\d{4}-\d{1,2}-\d{1,2}[T \t]+\d{1,2}:\d{2}:\d{2}(\.[0-9]*)?(([ \t]*)Z|[-+]\d{2}?(:\d{2})?)?$/
# Ensure that ":" and "," are always followed by a space
def self.convert_json_to_yaml(json) #:nodoc:
+ json = String.new(json) #can't modify a frozen string
scanner, quoting, marks, pos, times = StringScanner.new(json), false, [], nil, []
- while scanner.scan_until(/(\\['"]|['":,\\]|\\.)/)
+ while scanner.scan_until(/(\\['"]|['":,\/\\]|\\.)/)
case char = scanner[1]
when '"', "'"
if !quoting
quoting = char
pos = scanner.pos
@@ -39,14 +44,20 @@
total_marks = marks.size
times << pos+total_marks << scanner.pos+total_marks
end
quoting = false
end
+ when "/"
+ if !quoting
+ json[scanner.pos - 1] = "!ruby/regexp /"
+ scanner.pos += 13
+ scanner.scan_until(/\/[mix]*/)
+ end
when ":",","
marks << scanner.pos - 1 unless quoting
when "\\"
scanner.skip(/\\/)
- end
+ end
end
if marks.empty?
json.gsub(/\\\//, '/')
else