aboutsummaryrefslogtreecommitdiffstats
path: root/activesupport/lib/active_support/json/encoders/core.rb
blob: 97f994ac9aacd73f1915838855a10c7ed834d984 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
module ActiveSupport
  module JSON #:nodoc:
    module Encoders #:nodoc:
      define_encoder Object do |object|
        object.instance_values.to_json
      end
      
      define_encoder TrueClass do
        'true'
      end
      
      define_encoder FalseClass do
        'false'
      end
      
      define_encoder NilClass do
        'null'
      end
      
      define_encoder String do |string|
        returning value = '"' do
          string.each_char do |char|
            value << case
            when char == "\010":  '\b'
            when char == "\f":    '\f'
            when char == "\n":    '\n'
            when char == "\r":    '\r'
            when char == "\t":    '\t'
            when char == '"':     '\"'
            when char == '\\':    '\\\\'  
            when char.length > 1: "\\u#{'%04x' % char.unpack('U').first}"
            else;                 char
            end
          end
          value << '"'
        end
      end
      
      define_encoder Numeric do |numeric|
        numeric.to_s
      end
      
      define_encoder Symbol do |symbol|
        symbol.to_s.to_json
      end

      define_encoder Enumerable do |enumerable|
        "[#{enumerable.map { |value| value.to_json } * ', '}]"
      end
      
      define_encoder Hash do |hash|
        returning result = '{' do
          result << hash.map do |pair|
            pair.map { |value| value.to_json } * ': '
          end * ', '
          result << '}'
        end
      end

      define_encoder Regexp do |regexp|
        regexp.inspect
      end
    end
  end
end