module Oj

def self.json_create(h)

def self.json_create(h)
  new(h['t'] || h[:t])
end

def self.json_create(h)

def self.json_create(h)
  BigDecimal._load(h['b'])
end

def self.json_create(h)

def self.json_create(h)
  Complex(h['r'], h['i'])
end

def self.json_create(h)

def self.json_create(h)
  # offset is a rational as a string
  as, bs = h['of'].split('/')
  a = as.to_i
  b = bs.to_i
  if 0 == b
    off = a
  else
    off = Rational(a, b)
  end
  civil(h['y'], h['m'], h['d'], h['H'], h['M'], h['S'], off, h['sg'])
end

def self.json_create(h)

def self.json_create(h)
  civil(h['y'], h['m'], h['d'], h['sg'])
end

def self.json_create(h)

def self.json_create(h)
  e = new(h['m'])
  e.set_backtrace(h['b'])
  e
end

def self.json_create(h)

def self.json_create(h)
  new(*h['a'])
end

def self.json_create(h)

def self.json_create(h)
  Rational(h['n'], h['d'])
end

def self.json_create(h)

def self.json_create(h)
  new(h['s'], h['o'])
end

def self.json_create(h)

def self.json_create(h)
  new(*h['v'])
end

def self.json_create(h)

def self.json_create(h)
  h['s'].to_sym
end

def self.json_create(h)

def self.json_create(h)
  if (usec = h.delete('u'))
    h['n'] = usec * 1000
  end
  if instance_methods.include?(:tv_nsec)
    at(h['s'], Rational(h['n'], 1000))
  else
    at(h['s'], h['n'] / 1000)
  end
end

def self.mimic_loaded(mimic_paths=[])

Parameters:
  • mimic_paths (Array) -- additional paths to add to the Ruby loaded features.
def self.mimic_loaded(mimic_paths=[])
  $LOAD_PATH.each do |d|
    next unless File.exist?(d)
    jfile = File.join(d, 'json.rb')
    $LOADED_FEATURES << jfile unless $LOADED_FEATURES.include?(jfile) if File.exist?(jfile)
    Dir.glob(File.join(d, 'json', '**', '*.rb')).each do |file|
      # allow json/add/xxx to be loaded. User can override with Oj.add_to_json(xxx).
      $LOADED_FEATURES << file unless $LOADED_FEATURES.include?(file) unless file.include?('add')
    end
  end
  mimic_paths.each { |p| $LOADED_FEATURES << p }
  $LOADED_FEATURES << 'json' unless $LOADED_FEATURES.include?('json')
  require 'oj/json'
  if Object.const_defined?('OpenStruct')
    OpenStruct.class_eval do
      # Both the JSON gem and Rails monkey patch as_json. Let them battle it out.
      unless defined?(self.as_json)
        def as_json(*)
          name = self.class.name.to_s
          raise JSON::JSONError, "Only named structs are supported!" if 0 == name.length
          { JSON.create_id => name, 't' => table }
        end
      end
      def self.json_create(h)
        new(h['t'] || h[:t])
      end
    end
  end
  BigDecimal.class_eval do
    # Both the JSON gem and Rails monkey patch as_json. Let them battle it out.
    unless defined?(self.as_json)
      def as_json(*)
        {JSON.create_id => 'BigDecimal', 'b' => _dump }
      end
    end
    def self.json_create(h)
      BigDecimal._load(h['b'])
    end
  end
  Complex.class_eval do
    # Both the JSON gem and Rails monkey patch as_json. Let them battle it out.
    unless defined?(self.as_json)
      def as_json(*)
        {JSON.create_id => 'Complex', 'r' => real, 'i' => imag }
      end
    end
    def self.json_create(h)
      Complex(h['r'], h['i'])
    end
  end
  DateTime.class_eval do
    # Both the JSON gem and Rails monkey patch as_json. Let them battle it out.
    unless defined?(self.as_json)
      def as_json(*)
        { JSON.create_id => 'DateTime',
          'y' => year,
          'm' => month,
          'd' => day,
          'H' => hour,
          'M' => min,
          'S' => sec,
          'of' => offset.to_s,
          'sg' => start }
      end
    end
    def self.json_create(h)
      # offset is a rational as a string
      as, bs = h['of'].split('/')
      a = as.to_i
      b = bs.to_i
      if 0 == b
        off = a
      else
        off = Rational(a, b)
      end
      civil(h['y'], h['m'], h['d'], h['H'], h['M'], h['S'], off, h['sg'])
    end
  end
  Date.class_eval do
    # Both the JSON gem and Rails monkey patch as_json. Let them battle it out.
    unless defined?(self.as_json)
      def as_json(*)
        { JSON.create_id => 'Date', 'y' => year, 'm' => month, 'd' => day, 'sg' => start }
      end
    end
    def self.json_create(h)
      civil(h['y'], h['m'], h['d'], h['sg'])
    end
  end
  Exception.class_eval do
    # Both the JSON gem and Rails monkey patch as_json. Let them battle it out.
    unless defined?(self.as_json)
      def as_json(*)
        {JSON.create_id => self.class.name, 'm' => message, 'b' => backtrace }
      end
    end
    def self.json_create(h)
      e = new(h['m'])
      e.set_backtrace(h['b'])
      e
    end
  end
  Range.class_eval do
    # Both the JSON gem and Rails monkey patch as_json. Let them battle it out.
    unless defined?(self.as_json)
      def as_json(*)
        {JSON.create_id => 'Range', 'a' => [first, last, exclude_end?]}
      end
    end
    def self.json_create(h)
      new(*h['a'])
    end
  end
  Rational.class_eval do
    # Both the JSON gem and Rails monkey patch as_json. Let them battle it out.
    unless defined?(self.as_json)
      def as_json(*)
        {JSON.create_id => 'Rational', 'n' => numerator, 'd' => denominator }
      end
    end
    def self.json_create(h)
      Rational(h['n'], h['d'])
    end
  end
  Regexp.class_eval do
    # Both the JSON gem and Rails monkey patch as_json. Let them battle it out.
    unless defined?(self.as_json)
      def as_json(*)
        {JSON.create_id => 'Regexp', 'o' => options, 's' => source }
      end
    end
    def self.json_create(h)
      new(h['s'], h['o'])
    end
  end
  Struct.class_eval do
    # Both the JSON gem and Rails monkey patch as_json. Let them battle it out.
    unless defined?(self.as_json)
      def as_json(*)
        name = self.class.name.to_s
        raise JSON::JSONError, "Only named structs are supported!" if 0 == name.length
        { JSON.create_id => name, 'v' => values }
      end
    end
    def self.json_create(h)
      new(*h['v'])
    end
  end
  Symbol.class_eval do
    # Both the JSON gem and Rails monkey patch as_json. Let them battle it out.
    unless defined?(self.as_json)
      def as_json(*)
        {JSON.create_id => 'Symbol', 's' => to_s }
      end
    end
    def self.json_create(h)
      h['s'].to_sym
    end
  end
  Time.class_eval do
    # Both the JSON gem and Rails monkey patch as_json. Let them battle it out.
    unless defined?(self.as_json)
      def as_json(*)
        nsecs = [ tv_usec * 1000 ]
        nsecs << tv_nsec if respond_to?(:tv_nsec)
        nsecs = nsecs.max
        { JSON.create_id => 'Time', 's' => tv_sec, 'n' => nsecs }
      end
    end
    def self.json_create(h)
      if (usec = h.delete('u'))
        h['n'] = usec * 1000
      end
      if instance_methods.include?(:tv_nsec)
        at(h['s'], Rational(h['n'], 1000))
      else
        at(h['s'], h['n'] / 1000)
      end
    end
  end
end # self.mimic_loaded

def as_json(*)

def as_json(*)
  name = self.class.name.to_s
  raise JSON::JSONError, "Only named structs are supported!" if 0 == name.length
  { JSON.create_id => name, 't' => table }
end

def as_json(*)

def as_json(*)
  {JSON.create_id => 'BigDecimal', 'b' => _dump }
end

def as_json(*)

def as_json(*)
  {JSON.create_id => 'Complex', 'r' => real, 'i' => imag }
end

def as_json(*)

def as_json(*)
  { JSON.create_id => 'DateTime',
    'y' => year,
    'm' => month,
    'd' => day,
    'H' => hour,
    'M' => min,
    'S' => sec,
    'of' => offset.to_s,
    'sg' => start }
end

def as_json(*)

def as_json(*)
  { JSON.create_id => 'Date', 'y' => year, 'm' => month, 'd' => day, 'sg' => start }
end

def as_json(*)

def as_json(*)
  {JSON.create_id => self.class.name, 'm' => message, 'b' => backtrace }
end

def as_json(*)

def as_json(*)
  {JSON.create_id => 'Range', 'a' => [first, last, exclude_end?]}
end

def as_json(*)

def as_json(*)
  {JSON.create_id => 'Rational', 'n' => numerator, 'd' => denominator }
end

def as_json(*)

def as_json(*)
  {JSON.create_id => 'Regexp', 'o' => options, 's' => source }
end

def as_json(*)

def as_json(*)
  name = self.class.name.to_s
  raise JSON::JSONError, "Only named structs are supported!" if 0 == name.length
  { JSON.create_id => name, 'v' => values }
end

def as_json(*)

def as_json(*)
  {JSON.create_id => 'Symbol', 's' => to_s }
end

def as_json(*)

def as_json(*)
  nsecs = [ tv_usec * 1000 ]
  nsecs << tv_nsec if respond_to?(:tv_nsec)
  nsecs = nsecs.max
  { JSON.create_id => 'Time', 's' => tv_sec, 'n' => nsecs }
end