Sha256: 2682b3f29f0005eadcb889d0d88441a857be340b4aab5fefe52dfb3a842157fd

Contents?: true

Size: 1.83 KB

Versions: 16

Compression:

Stored size: 1.83 KB

Contents

require 'yaml'
require 'multi_json'
module RubySkynet
  module Zookeeper
    module Json

      # Deserialize from JSON entries in Zookeeper
      module Deserializer
        def self.deserialize(value)
          return value if value.nil? || (value == '')

          if value.strip.start_with?('{') || value.strip.start_with?('[{')
            symbolize(MultiJson.load(value))
          else
            symbolize_string(value)
          end
        end

        # Returns the supplied value symbolized
        def self.symbolize(v)
          if v.is_a?(Hash)
            symbolize_hash(v)
          elsif v.is_a?(Array)
            symbolize_array(v)
          elsif v.is_a?(String)
            symbolize_string(v)
          else
            v
          end
        end

        # Returns a new hash updated with keys and values that are strings
        # starting with ':' are turned into symbols
        def self.symbolize_hash(hash)
          h = hash.dup
          hash.each_pair do |k, v|
            # Convert values in the hash
            h[k] = symbolize(v)

            # Convert key to a symbol if it is a symbol string
            h[k[1..-1].to_sym] = h.delete(k) if k.is_a?(String) && k.start_with?(':')
          end
          h
        end

        # Returns a new Array with any symbols strings returned as symbols
        def self.symbolize_array(a)
          a.collect {|v| symbolize(v)}
        end

        # Returns a new string with the string parsed and symbol string converted to a symbol
        def self.symbolize_string(s)
          # JSON Parser cannot parse non-hash/array values
          value = YAML.load(s)
          # Now check for symbols which are strings starting with ':'
          value.is_a?(String) && value.start_with?(':') ? value[1..-1].to_sym : value
        rescue Exception
          s
        end

      end
    end
  end
end

Version data entries

16 entries across 16 versions & 1 rubygems

Version Path
ruby_skynet-2.0.0 lib/ruby_skynet/zookeeper/json/deserializer.rb
ruby_skynet-1.3.0.alpha3 lib/ruby_skynet/zookeeper/json/deserializer.rb
ruby_skynet-1.3.0.alpha2 lib/ruby_skynet/zookeeper/json/deserializer.rb
ruby_skynet-1.3.0.alpha1 lib/ruby_skynet/zookeeper/json/deserializer.rb
ruby_skynet-2.0.0.rc1 lib/ruby_skynet/zookeeper/json/deserializer.rb
ruby_skynet-1.2.7 lib/ruby_skynet/zookeeper/json/deserializer.rb
ruby_skynet-1.2.6 lib/ruby_skynet/zookeeper/json/deserializer.rb
ruby_skynet-1.2.5 lib/ruby_skynet/zookeeper/json/deserializer.rb
ruby_skynet-1.2.4 lib/ruby_skynet/zookeeper/json/deserializer.rb
ruby_skynet-1.2.3 lib/ruby_skynet/zookeeper/json/deserializer.rb
ruby_skynet-1.2.2 lib/ruby_skynet/zookeeper/json/deserializer.rb
ruby_skynet-1.2.1 lib/ruby_skynet/zookeeper/json/deserializer.rb
ruby_skynet-1.2.0 lib/ruby_skynet/zookeeper/json/deserializer.rb
ruby_skynet-1.1.1 lib/ruby_skynet/zookeeper/json/deserializer.rb
ruby_skynet-1.1.0 lib/ruby_skynet/zookeeper/json/deserializer.rb
ruby_skynet-1.0.0 lib/ruby_skynet/zookeeper/json/deserializer.rb