Module: Jinx::JSON::Serializable
- Defined in:
- lib/jinx/json/serializable.rb
Overview
Serializable is the JSON serializer Resource mix-in.
#to_json creates a JSON string from a jinxed object. The JSON payload is suitable for transfer to a remote Deserializer. This Serializable module is included directly in the jinxed application domain module after including Resource, e.g.:
module MyApp
include Jinx::JSON::Serializable, Jinx:Resource
which includes Resource followed by the Serializable.
The module which includes Serializable is extended with the Importer, which enables deserialization of the serialized JSON.
The JSON payload is built as follows:
-
non-domain properties are serialized
-
dependent references are serialized recursively
-
independent reference primary and secondary key content is serialized
-
circular references are precluded by truncating the reference with a surrogate object id
Class Method Summary collapse
Instance Method Summary collapse
-
#json_class_name ⇒ String
private
The JSON class name must be scoped by the Resource package module, not the Java package, in order to recognize the Jinx::Resource JSON hooks.
-
#json_value_hash(visited) ⇒ {Symbol => Object}
private
Builds a serializable attribute => value hash with content as follows: * If this domain object has not yet been visited, then the hash includes all attributes, as well as the Jinx::Resource#proxy_object_id.
-
#to_json(state = nil) ⇒ String
The JSON representation of this Resource.
Class Method Details
.included(other) ⇒ Object
30 31 32 33 34 35 36 37 |
# File 'lib/jinx/json/serializable.rb', line 30 def self.included(other) super if Class === other then other.extend(Deserializer) else other.extend(Deserializable) end end |
Instance Method Details
#json_class_name ⇒ String (private)
The JSON class name must be scoped by the Resource package module, not the Java package, in order to recognize the Jinx::Resource JSON hooks.
57 58 59 |
# File 'lib/jinx/json/serializable.rb', line 57 def json_class_name [self.class.domain_module, self.class.name.demodulize].join('::') end |
#json_value_hash(visited) ⇒ {Symbol => Object} (private)
Builds a serializable attribute => value hash with content as follows:
-
If this domain object has not yet been visited, then the hash includes all attributes, as well as the Jinx::Resource#proxy_object_id.
-
If this domain object has already been visited, then the hash includes only the
proxy_object_id.
Each Set attribute value is converted to an array, since JSON does not serialize a Set properly.
The Deserializer is responsible for reconstituting the domain object graph from the serialized content.
74 75 76 77 78 79 80 81 82 83 84 85 |
# File 'lib/jinx/json/serializable.rb', line 74 def json_value_hash(visited) # If already visited, then the only content is the object id. if visited.include?(self) then return {:object_id => proxy_object_id} end visited << self vh = value_hash(self.class.java_attributes) vh.each { |pa, v| vh[pa] = v.to_a if Set === v } # Add the object id. vh[:object_id] = proxy_object_id vh end |
#to_json(state = nil) ⇒ String
Returns the JSON representation of this Resource.
41 42 43 44 45 46 47 48 49 |
# File 'lib/jinx/json/serializable.rb', line 41 def to_json(state=nil) # Make a new State from the options if this is a top-level call. state = State.for(state) unless State === state # the JSON content { 'json_class' => json_class_name, 'data' => json_value_hash(state.visited) }.to_json(state) end |