Class: DDP::EJSON

Inherits:
Object
  • Object
show all
Defined in:
lib/ddp/ejson.rb

Overview

EJSON is a way of embedding more than the built-in JSON types in JSON. It supports all types built into JSON as plain JSON, plus some custom types identified by a key prefixed with ‘$’.

Defined Under Namespace

Modules: Serializable Classes: InvalidSerializableClassError, UnknownTypeError

Class Method Summary collapse

Class Method Details

.add_serializable_class(klass) ⇒ Object



87
88
89
90
# File 'lib/ddp/ejson.rb', line 87

def self.add_serializable_class(klass)
  @classes ||= {}
  @classes[klass.name] = klass
end

.as_ejson(object) ⇒ Object



29
30
31
32
33
34
35
36
37
38
39
# File 'lib/ddp/ejson.rb', line 29

def self.as_ejson(object)
  if object.respond_to? :as_ejson
    object.as_ejson
  elsif object.is_a? Hash
    hash_as_ejson(object)
  elsif object.is_a? Array
    object.map { |i| as_ejson(i) }
  else
    object
  end
end

.deserialize(object) ⇒ Object



19
20
21
22
23
24
25
26
27
# File 'lib/ddp/ejson.rb', line 19

def self.deserialize(object)
  if object.is_a? Hash
    deserialize_hash(object)
  elsif object.is_a? Array
    object.map { |e| deserialize(e) }
  else
    object
  end
end

.deserialize_escape(hash) ⇒ Object



72
73
74
75
76
# File 'lib/ddp/ejson.rb', line 72

def self.deserialize_escape(hash)
  hash.map do |k, v|
    [k, deserialize(v)]
  end.to_h
end

.deserialize_hash(hash) ⇒ Object



53
54
55
56
57
# File 'lib/ddp/ejson.rb', line 53

def self.deserialize_hash(hash)
  deserialize_operation(hash) || hash.map do |k, v|
    [k, deserialize(v)]
  end.to_h
end

.deserialize_operation(hash) ⇒ Object



59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/ddp/ejson.rb', line 59

def self.deserialize_operation(hash)
  if hash['$escape']
    return deserialize_escape(hash['$escape'])
  elsif hash['$date']
    return Time.at(hash['$date'] / 1000.0)
  elsif hash['$binary']
    return Base64.decode64(hash['$binary'])
  elsif hash['$type']
    return deserialize_type(hash)
  end
  false
end

.deserialize_type(hash) ⇒ Object



78
79
80
81
82
83
84
85
# File 'lib/ddp/ejson.rb', line 78

def self.deserialize_type(hash)
  klass = @classes[hash['$type']]
  if klass
    klass.from_ejson(hash['$value'])
  else
    raise UnknownTypeError, "Don't know how to deserialize #{hash['$type']}"
  end
end

.generate(object) ⇒ Object



15
16
17
# File 'lib/ddp/ejson.rb', line 15

def self.generate(object)
  JSON.generate as_ejson(object)
end

.hash_as_ejson(hash) ⇒ Object

Hashes can contain keys that need to be escaped



42
43
44
45
46
47
48
49
50
51
# File 'lib/ddp/ejson.rb', line 42

def self.hash_as_ejson(hash)
  result = hash.map do |k, v|
    if k.is_a?(String) && k[0] == '$'
      ['$escape', { k => as_ejson(v) }]
    else
      [k, as_ejson(v)]
    end
  end
  Hash[result]
end

.parse(string) ⇒ Object



9
10
11
12
13
# File 'lib/ddp/ejson.rb', line 9

def self.parse(string)
  parsed = JSON.parse string

  deserialize(parsed)
end

.rename_serializable_class(klass, name) ⇒ Object



92
93
94
95
# File 'lib/ddp/ejson.rb', line 92

def self.rename_serializable_class(klass, name)
  @classes.delete(klass.name)
  @classes[name] = klass
end