Class: DDP::EJSON
- Inherits:
-
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
|