Add yajl-ruby as a JSON parsing backend

[#2666 state:committed]

Signed-off-by: Jeremy Kemper <jeremy@bitsweat.net>
This commit is contained in:
Brian Lopez
2010-01-26 08:40:35 -08:00
committed by Jeremy Kemper
parent c548e21365
commit a96bf4ab5e
3 changed files with 46 additions and 0 deletions

View File

@@ -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]

View File

@@ -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

View File

@@ -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|