Changeset 7697
- Timestamp:
- 09/30/07 20:57:50 (2 years ago)
- Files:
-
- trunk/actionpack/test/controller/render_test.rb (modified) (3 diffs)
- trunk/activerecord/test/json_serialization_test.rb (modified) (2 diffs)
- trunk/activesupport/CHANGELOG (modified) (1 diff)
- trunk/activesupport/lib/active_support/json/encoders/hash.rb (modified) (1 diff)
- trunk/activesupport/lib/active_support/json/encoding.rb (modified) (2 diffs)
- trunk/activesupport/lib/active_support/json/variable.rb (modified) (1 diff)
- trunk/activesupport/test/json/encoding_test.rb (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/actionpack/test/controller/render_test.rb
r7403 r7697 210 210 def test_do_with_render_json 211 211 get :render_json_hello_world 212 assert_equal '{ hello: "world"}', @response.body212 assert_equal '{"hello": "world"}', @response.body 213 213 assert_equal 'application/json', @response.content_type 214 214 end … … 216 216 def test_do_with_render_json_with_callback 217 217 get :render_json_hello_world_with_callback 218 assert_equal 'alert({ hello: "world"})', @response.body218 assert_equal 'alert({"hello": "world"})', @response.body 219 219 assert_equal 'application/json', @response.content_type 220 220 end … … 222 222 def test_do_with_render_symbol_json 223 223 get :render_symbol_json 224 assert_equal '{ hello: "world"}', @response.body224 assert_equal '{"hello": "world"}', @response.body 225 225 assert_equal 'application/json', @response.content_type 226 226 end trunk/activerecord/test/json_serialization_test.rb
r7674 r7697 9 9 class JsonSerializationTest < Test::Unit::TestCase 10 10 def setup 11 # Quote all keys (so that we can test against strictly valid JSON).12 ActiveSupport::JSON.unquote_hash_key_identifiers = false13 14 11 @contact = Contact.new( 15 12 :name => 'Konata Izumi', … … 71 68 72 69 def setup 73 ActiveSupport::JSON.unquote_hash_key_identifiers = false74 75 70 @david = authors(:david) 76 71 end trunk/activesupport/CHANGELOG
r7685 r7697 1 1 *2.0.0 [Preview Release]* (September 29th, 2007) 2 3 * Fixed JSON encoding to use quoted keys according to the JSON standard #8762 [choonkat/chuyeow] 2 4 3 5 * Alias Object#send to send! for Ruby 1.9 forward compatibility. [Jeremy Kemper] trunk/activesupport/lib/active_support/json/encoders/hash.rb
r6443 r7697 3 3 returning result = '{' do 4 4 result << map do |key, value| 5 key = ActiveSupport::JSON::Variable.new(key.to_s) if6 ActiveSupport::JSON.can_unquote_identifier?(key)7 5 "#{ActiveSupport::JSON.encode(key)}: #{ActiveSupport::JSON.encode(value)}" 8 6 end * ', ' trunk/activesupport/lib/active_support/json/encoding.rb
r6772 r7697 11 11 module ActiveSupport 12 12 module JSON 13 # When +true+, Hash#to_json will omit quoting string or symbol keys14 # if the keys are valid JavaScript identifiers. Note that this is15 # technically improper JSON (all object keys must be quoted), so if16 # you need strict JSON compliance, set this option to +false+.17 mattr_accessor :unquote_hash_key_identifiers18 @@unquote_hash_key_identifiers = true19 20 13 class CircularReferenceError < StandardError 21 14 end … … 29 22 value.send(:to_json) 30 23 end 31 end32 33 def can_unquote_identifier?(key) #:nodoc:34 unquote_hash_key_identifiers &&35 ActiveSupport::JSON.valid_identifier?(key)36 24 end 37 25 trunk/activesupport/lib/active_support/json/variable.rb
r6443 r7697 1 1 module ActiveSupport 2 2 module JSON 3 # A string that returns itself as asits JSON-encoded form.3 # A string that returns itself as its JSON-encoded form. 4 4 class Variable < String 5 5 def to_json trunk/activesupport/test/json/encoding_test.rb
r6893 r7697 42 42 end 43 43 44 def setup45 unquote(false)46 end47 48 def teardown49 unquote(true)50 end51 52 44 def test_hash_encoding 53 45 assert_equal %({\"a\": \"b\"}), { :a => :b }.to_json 54 46 assert_equal %({\"a\": 1}), { 'a' => 1 }.to_json 55 47 assert_equal %({\"a\": [1, 2]}), { 'a' => [1,2] }.to_json 56 57 sorted_json = 58 '{' + {:a => :b, :c => :d}.to_json[1..-2].split(', ').sort.join(', ') + '}' 48 49 sorted_json = '{' + {:a => :b, :c => :d}.to_json[1..-2].split(', ').sort.join(', ') + '}' 59 50 assert_equal %({\"a\": \"b\", \"c\": \"d\"}), sorted_json 60 51 end … … 73 64 assert_raises(ActiveSupport::JSON::CircularReferenceError) { a.to_json } 74 65 end 75 76 def test_ unquote_hash_key_identifiers66 67 def test_hash_key_identifiers_are_always_quoted 77 68 values = {0 => 0, 1 => 1, :_ => :_, "$" => "$", "a" => "a", :A => :A, :A0 => :A0, "A0B" => "A0B"} 78 69 assert_equal %w( "$" "A" "A0" "A0B" "_" "a" 0 1 ), object_keys(values.to_json) 79 unquote(true) { assert_equal %w( $ 0 1 A A0 A0B _ a ), object_keys(values.to_json) }80 70 end 81 82 def test_unquote_hash_key_identifiers_ignores_javascript_reserved_words 83 values = {"hello" => "world", "this" => "that", "with" => "foo"} 84 unquote(true) { assert_equal %w( "this" "with" hello ), object_keys(values.to_json) } 85 end 86 71 87 72 protected 88 def unquote(value)89 previous_value = ActiveSupport::JSON.unquote_hash_key_identifiers90 ActiveSupport::JSON.unquote_hash_key_identifiers = value91 yield if block_given?92 ensure93 ActiveSupport::JSON.unquote_hash_key_identifiers = previous_value if block_given?94 end95 96 73 def object_keys(json_object) 97 74 json_object[1..-2].scan(/([^{}:,\s]+):/).flatten.sort 98 75 end 99 100 76 end