aboutsummaryrefslogtreecommitdiffstats
path: root/activesupport
diff options
context:
space:
mode:
Diffstat (limited to 'activesupport')
-rw-r--r--activesupport/CHANGELOG5
-rw-r--r--activesupport/lib/active_support/json/backends/yajl.rb40
-rw-r--r--activesupport/test/json/decoding_test.rb1
3 files changed, 46 insertions, 0 deletions
diff --git a/activesupport/CHANGELOG b/activesupport/CHANGELOG
index 431607f4e0..71eeff3a53 100644
--- a/activesupport/CHANGELOG
+++ b/activesupport/CHANGELOG
@@ -1,5 +1,10 @@
*Rails 3.0 (pending)*
+* JSON backend for YAJL. #2666 [Brian Lopez]
+
+
+*Rails 3.0.0 [beta] (February 4, 2010)*
+
* Introduce class_attribute to declare inheritable class attributes. Writing an attribute on a subclass behaves just like overriding the superclass reader method. Unifies and replaces most usage of cattr_accessor, class_inheritable_attribute, superclass_delegating_attribute, and extlib_inheritable_attribute. [Jeremy Kemper, Yehuda Katz]
* Time#- with a DateTime argument behaves the same as with a Time argument, i.e. returns the difference between self and arg as a Float #3476 [Geoff Buesing]
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
diff --git a/activesupport/test/json/decoding_test.rb b/activesupport/test/json/decoding_test.rb
index 8fcb16abfb..fbd75a8966 100644
--- a/activesupport/test/json/decoding_test.rb
+++ b/activesupport/test/json/decoding_test.rb
@@ -49,6 +49,7 @@ class TestJSONDecoding < ActiveSupport::TestCase
backends = %w(Yaml)
backends << "JSONGem" if defined?(::JSON)
+ backends << "Yajl" if defined?(::Yajl)
backends.each do |backend|
TESTS.each do |json, expected|