diff --git a/activesupport/lib/active_support/core_ext/object/json.rb b/activesupport/lib/active_support/core_ext/object/json.rb index 5157b0402f..1a1fa1eedd 100644 --- a/activesupport/lib/active_support/core_ext/object/json.rb +++ b/activesupport/lib/active_support/core_ext/object/json.rb @@ -164,7 +164,7 @@ end class Array def as_json(options = nil) #:nodoc: - map { |v| v.as_json(options && options.dup) } + map { |v| options ? v.as_json(options.dup) : v.as_json } end def encode_json(encoder) #:nodoc: @@ -187,7 +187,7 @@ class Hash self end - Hash[subset.map { |k, v| [k.to_s, v.as_json(options && options.dup)] }] + Hash[subset.map { |k, v| [k.to_s, options ? v.as_json(options.dup) : v.as_json] }] end def encode_json(encoder) #:nodoc: diff --git a/activesupport/test/json/encoding_test.rb b/activesupport/test/json/encoding_test.rb index 39da760bf2..00f43be6d4 100644 --- a/activesupport/test/json/encoding_test.rb +++ b/activesupport/test/json/encoding_test.rb @@ -32,6 +32,12 @@ class TestJSONEncoding < ActiveSupport::TestCase end end + class OptionsTest + def as_json(options = :default) + options + end + end + class HashWithAsJson < Hash attr_accessor :as_json_called @@ -332,6 +338,16 @@ class TestJSONEncoding < ActiveSupport::TestCase "other_hash" => {"foo"=>"other_foo","test"=>"other_test"}}, ActiveSupport::JSON.decode(hash.to_json)) end + def test_hash_as_json_without_options + json = { foo: OptionsTest.new }.as_json + assert_equal({"foo" => :default}, json) + end + + def test_array_as_json_without_options + json = [ OptionsTest.new ].as_json + assert_equal([:default], json) + end + def test_struct_encoding Struct.new('UserNameAndEmail', :name, :email) Struct.new('UserNameAndDate', :name, :date)