aboutsummaryrefslogtreecommitdiffstats
path: root/activesupport/lib/active_support/json/backends/yajl.rb
diff options
context:
space:
mode:
authorMikel Lindsaar <raasdnil@gmail.com>2010-03-11 22:07:48 +1100
committerMikel Lindsaar <raasdnil@gmail.com>2010-03-11 22:07:48 +1100
commit965fe59bff249ad91131a444e1fbd63dc4411db3 (patch)
treeec2d54d5eaad9e32bce1758e6a67c364279bbd39 /activesupport/lib/active_support/json/backends/yajl.rb
parent79f02a473cb6aef00003745f23802314c8c89e7d (diff)
parent4adcbb6b2d6cef49ac28df4254ac74e09f14dcf7 (diff)
downloadrails-965fe59bff249ad91131a444e1fbd63dc4411db3.tar.gz
rails-965fe59bff249ad91131a444e1fbd63dc4411db3.tar.bz2
rails-965fe59bff249ad91131a444e1fbd63dc4411db3.zip
Merge branch 'master' of github.com:lifo/docrails
Diffstat (limited to 'activesupport/lib/active_support/json/backends/yajl.rb')
-rw-r--r--activesupport/lib/active_support/json/backends/yajl.rb40
1 files changed, 40 insertions, 0 deletions
diff --git a/activesupport/lib/active_support/json/backends/yajl.rb b/activesupport/lib/active_support/json/backends/yajl.rb
new file mode 100644
index 0000000000..d76f8b03e4
--- /dev/null
+++ b/activesupport/lib/active_support/json/backends/yajl.rb
@@ -0,0 +1,40 @@
+require 'yajl-ruby' unless defined?(Yajl)
+
+module ActiveSupport
+ module JSON
+ module Backends
+ module Yajl
+ ParseError = ::Yajl::ParseError
+ extend self
+
+ # Parses a JSON string or IO and convert it into an object
+ def decode(json)
+ data = ::Yajl::Parser.new.parse(json)
+ if ActiveSupport.parse_json_times
+ convert_dates_from(data)
+ else
+ data
+ end
+ end
+
+ private
+ def convert_dates_from(data)
+ case data
+ when nil
+ nil
+ when DATE_REGEX
+ DateTime.parse(data)
+ when Array
+ data.map! { |d| convert_dates_from(d) }
+ when Hash
+ data.each do |key, value|
+ data[key] = convert_dates_from(value)
+ end
+ else
+ data
+ end
+ end
+ end
+ end
+ end
+end