Class: Hash

Overview

:nodoc:

Direct Known Subclasses

HashWithIndifferentAccess

Constant Summary

Constants included from ActiveSupport::CoreExtensions::Hash::Conversions

ActiveSupport::CoreExtensions::Hash::Conversions::XML_FORMATTING, ActiveSupport::CoreExtensions::Hash::Conversions::XML_PARSING, ActiveSupport::CoreExtensions::Hash::Conversions::XML_TYPE_NAMES

Instance Method Summary collapse

Methods included from ActiveSupport::CoreExtensions::Hash::Except

#except, #except!

Methods included from ActiveSupport::CoreExtensions::Hash::Slice

#slice, #slice!

Methods included from ActiveSupport::CoreExtensions::Hash::Diff

#diff

Methods included from ActiveSupport::CoreExtensions::Hash::Conversions

included, #to_query, #to_xml

Methods included from ActiveSupport::CoreExtensions::Hash::ReverseMerge

#reverse_merge, #reverse_merge!

Methods included from ActiveSupport::CoreExtensions::Hash::IndifferentAccess

#with_indifferent_access

Methods included from ActiveSupport::CoreExtensions::Hash::Keys

#assert_valid_keys, #stringify_keys, #stringify_keys!, #symbolize_keys, #symbolize_keys!

Instance Method Details

#to_json(options = {}) ⇒ Object

Returns a JSON string representing the hash.

Without any options, the returned JSON string will include all the hash keys. For example:

{ :name => "Konata Izumi", 'age' => 16, 1 => 2 }.to_json
# => {"name": "Konata Izumi", 1: 2, "age": 16}

The keys in the JSON string are unordered due to the nature of hashes.

The :only and :except options can be used to limit the attributes included, and will accept 1 or more hash keys to include/exclude.

{ :name => "Konata Izumi", 'age' => 16, 1 => 2 }.to_json(:only => [:name, 'age'])
# => {"name": "Konata Izumi", "age": 16}

{ :name => "Konata Izumi", 'age' => 16, 1 => 2 }.to_json(:except => 1)
# => {"name": "Konata Izumi", "age": 16}

The options also filter down to any hash values. This is particularly useful for converting hashes containing ActiveRecord objects or any object that responds to options in their to_json method. For example:

users = User.find(:all)
{ :users => users, :count => users.size }.to_json(:include => :posts)

would pass the :include => :posts option to users, allowing the posts association in the User model to be converted to JSON as well.



31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/active_support/json/encoders/hash.rb', line 31

def to_json(options = {}) #:nodoc:
  hash_keys = self.keys

  if options[:except]
    hash_keys = hash_keys - Array(options[:except])
  elsif options[:only]
    hash_keys = hash_keys & Array(options[:only])
  end

  returning result = '{' do
    result << hash_keys.map do |key|
      "#{ActiveSupport::JSON.encode(key)}: #{ActiveSupport::JSON.encode(self[key], options)}"
    end * ', '
    result << '}'
  end
end