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