mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Merge pull request #12782 from chancancode/fix_object_and_struct_as_json
Fixed Object#as_json and Struct#as_json with options
This commit is contained in:
commit
aadb8c962a
3 changed files with 40 additions and 5 deletions
|
@ -1,3 +1,13 @@
|
|||
* Fixed Object#as_json and Struct#as_json not working properly with options. They now take
|
||||
the same options as Hash#as_json:
|
||||
|
||||
struct = Struct.new(:foo, :bar).new
|
||||
struct.foo = "hello"
|
||||
struct.bar = "world"
|
||||
json = struct.as_json(only: [:foo]) # => {foo: "hello"}
|
||||
|
||||
*Sergio Campamá*, *Godfrey Chan*
|
||||
|
||||
* Added Numeric#in_milliseconds, like 1.hour.in_milliseconds, so we can feed them to JavaScript functions like getTime().
|
||||
|
||||
*DHH*
|
||||
|
|
|
@ -20,16 +20,16 @@ end
|
|||
class Object
|
||||
def as_json(options = nil) #:nodoc:
|
||||
if respond_to?(:to_hash)
|
||||
to_hash
|
||||
to_hash.as_json(options)
|
||||
else
|
||||
instance_values
|
||||
instance_values.as_json(options)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
class Struct #:nodoc:
|
||||
def as_json(options = nil)
|
||||
Hash[members.zip(values)]
|
||||
Hash[members.zip(values)].as_json(options)
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -13,7 +13,7 @@ class TestJSONEncoding < ActiveSupport::TestCase
|
|||
|
||||
class Hashlike
|
||||
def to_hash
|
||||
{ :a => 1 }
|
||||
{ :foo => "hello", :bar => "world" }
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -61,7 +61,7 @@ class TestJSONEncoding < ActiveSupport::TestCase
|
|||
[ :"a b", %("a b") ]]
|
||||
|
||||
ObjectTests = [[ Foo.new(1, 2), %({\"a\":1,\"b\":2}) ]]
|
||||
HashlikeTests = [[ Hashlike.new, %({\"a\":1}) ]]
|
||||
HashlikeTests = [[ Hashlike.new, %({\"bar\":\"world\",\"foo\":\"hello\"}) ]]
|
||||
CustomTests = [[ Custom.new, '"custom"' ]]
|
||||
|
||||
RegexpTests = [[ /^a/, '"(?-mix:^a)"' ], [/^\w{1,2}[a-z]+/ix, '"(?ix-m:^\\\\w{1,2}[a-z]+)"']]
|
||||
|
@ -204,6 +204,31 @@ class TestJSONEncoding < ActiveSupport::TestCase
|
|||
end
|
||||
end
|
||||
|
||||
def test_hash_like_with_options
|
||||
h = Hashlike.new
|
||||
json = h.to_json :only => [:foo]
|
||||
|
||||
assert_equal({"foo"=>"hello"}, JSON.parse(json))
|
||||
end
|
||||
|
||||
def test_object_to_json_with_options
|
||||
obj = Object.new
|
||||
obj.instance_variable_set :@foo, "hello"
|
||||
obj.instance_variable_set :@bar, "world"
|
||||
json = obj.to_json :only => ["foo"]
|
||||
|
||||
assert_equal({"foo"=>"hello"}, JSON.parse(json))
|
||||
end
|
||||
|
||||
def test_struct_to_json_with_options
|
||||
struct = Struct.new(:foo, :bar).new
|
||||
struct.foo = "hello"
|
||||
struct.bar = "world"
|
||||
json = struct.to_json :only => [:foo]
|
||||
|
||||
assert_equal({"foo"=>"hello"}, JSON.parse(json))
|
||||
end
|
||||
|
||||
def test_hash_should_pass_encoding_options_to_children_in_as_json
|
||||
person = {
|
||||
:name => 'John',
|
||||
|
|
Loading…
Reference in a new issue