diff options
author | Brian Lopez <seniorlopez@gmail.com> | 2010-01-26 08:40:35 -0800 |
---|---|---|
committer | Jeremy Kemper <jeremy@bitsweat.net> | 2010-02-05 10:15:51 -0800 |
commit | a96bf4ab5e73fccdafb78b99e8a122cc2172b505 (patch) | |
tree | 3c2f89d4903b4d69f7248e1a7d36030c6ce6c04c | |
parent | c548e213658386f3a5b00097bc5b30bf3736e6b4 (diff) | |
download | rails-a96bf4ab5e73fccdafb78b99e8a122cc2172b505.tar.gz rails-a96bf4ab5e73fccdafb78b99e8a122cc2172b505.tar.bz2 rails-a96bf4ab5e73fccdafb78b99e8a122cc2172b505.zip |
Add yajl-ruby as a JSON parsing backend
[#2666 state:committed]
Signed-off-by: Jeremy Kemper <jeremy@bitsweat.net>
-rw-r--r-- | activesupport/CHANGELOG | 5 | ||||
-rw-r--r-- | activesupport/lib/active_support/json/backends/yajl.rb | 40 | ||||
-rw-r--r-- | activesupport/test/json/decoding_test.rb | 1 |
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| |