Sha256: c4c363d2acf1c31cd9be26d9ace4b55de5074243c828a799c066128739164f56

Contents?: true

Size: 1.69 KB

Versions: 2

Compression:

Stored size: 1.69 KB

Contents

require 'singleton'
require 'fog/core/logger'

module Fog
  class JSON
    include Singleton

    class LoadError < StandardError
      attr_reader :data
      def initialize(message='', backtrace=[], data='')
        super(message)
        self.set_backtrace(backtrace)
        @data = data
      end
    end

    module LegacyJSON
      def encode(obj)
        ::JSON.generate(obj)
      end

      def decode(obj)
        ::JSON.parse(obj)
      rescue ::JSON::ParserError => e
        raise LoadError.new(e.message, e.backtrace, obj)
      end
    end

    module NewJSON
      def encode(obj)
        ::MultiJson.encode(obj)
      end

      def decode(obj)
        ::MultiJson.decode(obj)
      rescue MultiJson::LoadError => e
        raise LoadError.new(e.message, e.backtrace, obj)
      end
    end

    begin
      require 'multi_json'
      include NewJSON
    rescue Exception
      Fog::Logger.deprecation "Defaulting to json library for json parsing. Please consider using multi_json library for the greatest performance/flexibility."
      require 'json'
      include LegacyJSON
    end

    def self.sanitize(data)
      case data
      when Array
        data.map {|datum| sanitize(datum)}
      when Hash
        for key, value in data
          data[key] = sanitize(value)
        end
      when ::Time
        data.strftime("%Y-%m-%dT%H:%M:%SZ")
      else
        data
      end
    end

    # Do the MultiJson introspection at this level so we can define our encode/decode methods and perform
    # the introspection only once rather than once per call.
    def self.encode(obj)
      Fog::JSON.instance.encode(obj)
    end

    def self.decode(obj)
      Fog::JSON.instance.decode(obj)
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
fog-1.11.1 lib/fog/core/json.rb
fog-1.11.0 lib/fog/core/json.rb