class Sawyer::Serializer

Public Class Methods

any_json() click to toggle source
# File lib/sawyer/serializer.rb, line 6
def self.any_json
  yajl || multi_json || json
end
json() click to toggle source
# File lib/sawyer/serializer.rb, line 16
def self.json
  require 'json'
  new(JSON)
rescue LoadError
end
message_pack() click to toggle source
# File lib/sawyer/serializer.rb, line 28
def self.message_pack
  require 'msgpack'
  new(MessagePack, :pack, :unpack)
rescue LoadError
end
multi_json() click to toggle source
# File lib/sawyer/serializer.rb, line 22
def self.multi_json
  require 'multi_json'
  new(MultiJson)
rescue LoadError
end
new(format, dump_method_name = nil, load_method_name = nil) click to toggle source

Public: Wraps a serialization format for Sawyer. Nested objects are prepared for serialization (such as changing Times to ISO 8601 Strings). Any serialization format that responds to dump and load will work.

# File lib/sawyer/serializer.rb, line 37
def initialize(format, dump_method_name = nil, load_method_name = nil)
  @format = format
  @dump = @format.method(dump_method_name || :dump)
  @load = @format.method(load_method_name || :load)
end
yajl() click to toggle source
# File lib/sawyer/serializer.rb, line 10
def self.yajl
  require 'yajl'
  new(Yajl)
rescue LoadError
end

Public Instance Methods

decode(data) click to toggle source

Public: Decodes a String into an Object (usually a Hash or Array of Hashes).

data - An encoded String.

Returns a decoded Object.

# File lib/sawyer/serializer.rb, line 60
def decode(data)
  return nil if data.nil? || data.strip.empty?
  decode_object(@load.call(data))
end
Also aliased as: load
decode_hash(hash) click to toggle source
# File lib/sawyer/serializer.rb, line 94
def decode_hash(hash)
  hash.keys.each do |key|
    hash[key.to_sym] = decode_hash_value(key, hash.delete(key))
  end
  hash
end
decode_hash_value(key, value) click to toggle source
# File lib/sawyer/serializer.rb, line 101
def decode_hash_value(key, value)
  if time_field?(key, value)
    if value.is_a?(String)
      begin
        Time.parse(value)
      rescue ArgumentError
        value
      end
    elsif value.is_a?(Integer) || value.is_a?(Float)
      Time.at(value)
    else
      value
    end
  elsif value.is_a?(Hash)
    decode_hash(value)
  elsif value.is_a?(Array)
    value.map { |o| decode_hash_value(key, o) }
  else
    value
  end
end
decode_object(data) click to toggle source
# File lib/sawyer/serializer.rb, line 86
def decode_object(data)
  case data
  when Hash then decode_hash(data)
  when Array then data.map { |o| decode_object(o) }
  else data
  end
end
dump(data)
Alias for: encode
encode(data) click to toggle source

Public: Encodes an Object (usually a Hash or Array of Hashes).

data - Object to be encoded.

Returns an encoded String.

# File lib/sawyer/serializer.rb, line 48
def encode(data)
  @dump.call(encode_object(data))
end
Also aliased as: dump
encode_hash(hash) click to toggle source
# File lib/sawyer/serializer.rb, line 75
def encode_hash(hash)
  hash.keys.each do |key|
    case value = hash[key]
    when Date then hash[key] = value.to_time.utc.xmlschema
    when Time then hash[key] = value.utc.xmlschema
    when Hash then hash[key] = encode_hash(value)
    end
  end
  hash
end
encode_object(data) click to toggle source
# File lib/sawyer/serializer.rb, line 67
def encode_object(data)
  case data
  when Hash then encode_hash(data)
  when Array then data.map { |o| encode_object(o) }
  else data
  end
end
load(data)
Alias for: decode
time_field?(key, value) click to toggle source
# File lib/sawyer/serializer.rb, line 123
def time_field?(key, value)
  value && (key =~ /_(at|on)\z/ || key =~ /(\A|_)date\z/)
end